如何在.NET4.7中定义具有命名字段的元组?

如何在.NET4.7中定义具有命名字段的元组?,.net,vb.net,.net,Vb.net,我试图让一个函数返回一个带有命名字段的ValueTuple,而不是“Item1”、“Item2”等 看一下,我有以下功能: Public Function MyFunction() as (Success as Boolean, Results as Boolean) Return (True, False) end Function Dim test = MyFunction() If test.Success Then 'Do something with test.Re

我试图让一个函数返回一个带有命名字段的ValueTuple,而不是“Item1”、“Item2”等

看一下,我有以下功能:

Public Function MyFunction() as (Success as Boolean, Results as Boolean)
    Return (True, False)
end Function

Dim test = MyFunction()

If test.Success Then
    'Do something with test.Result
End If
这可以编译,但如果我在if语句上放置断点并查看“test”,它会将其字段显示为“Item1”和“Item2”。它还在运行时引发以下异常:

System.MissingMemberException: 'Public member 'Success' on type 'ValueTuple(Of Boolean,Boolean)' not found.'
此外,文档仅在“Option Strict Off”(选项严格关闭)下工作,但是我们在代码中启用了它,并且代码不会在Option Strict On(选项严格打开)下编译

使用Option Strict On,我尝试了以下方法:

Dim test as ValueTuple(Of Success as Boolean, Results as Boolean) = MyFunction()
然而,它在“Success”上给出了一个编译时错误,表示它没有定义

我的语法错了吗?在设置选项Strict On时,如何定义一个变量作为该函数的输出,并使用命名字段


如果相关的话,我的项目在.NET 4.6.1中,但是我已经使用NuGet package manager添加了ValueTuple包。

在您的问题中有一些令人困惑的事情,但是大部分都很容易澄清

元组提供了与.NET framework中匿名类型类似的功能,但它们的实现方式不同,我认为这种差异在这里造成了混淆

让我们看看这段代码:

Dim x = (Success := True, Results := False)

Dim y = New With {.Success = True, .Results = False}
第一个是元组,第二个是匿名类型

它们可以以类似的方式使用:

Console.WriteLine(x.Success)
Console.WriteLine(y.Success)

Console.WriteLine(x.Results)
Console.WriteLine(y.Results)
不过,在引擎盖下,它们的构造不同

下面是反编译的相同代码(作为C#,这是我的工具生成的所有代码):

我得到:

Item1, Item2 Success, Results 匿名类型不能这样做


在您的问题中,您说运行代码时出现运行时错误。我的电脑上没有这个。您的第一批代码运行良好。

您使用的是哪个版本的Visual Studio?我不确定在VB中如何使用,但至少在C#中,命名元组需要编译器支持。如果您使用的是Visual Studio的旧版本,但不知道命名元组,这可以解释为什么它不适用于您。我使用的是15.9.13,我相信它是VS2017的最新版本。2019年会有更好的支持吗?我还没有意识到它已经有了一个稳定的版本。即使对有严格的
选项,这段代码也能像预期的那样工作。将
选项“推断”保持为打开状态
。当然,您需要在一个方法中设置
Dim test=MyFunction()
。但是,当
4.8
已经退出时,为什么要在.Net
4.6.1
上启动一个新项目呢。至少使用
4.7.2
。推荐。为什么你的标题是.NET 4.7,而你的问题是.NET 4.6.1?
Console.WriteLine(String.Join(", ", x.GetType().GetFields().Select(Function(z) z.Name)))
Console.WriteLine(String.Join(", ", y.GetType().GetProperties().Select(Function(z) z.Name)))
Item1, Item2 Success, Results
Dim w As (Apple As Boolean, Banana As Boolean) = x

Console.WriteLine(w.Apple)
Console.WriteLine(w.Banana)