如何在.NET4.7中定义具有命名字段的元组?
我试图让一个函数返回一个带有命名字段的ValueTuple,而不是“Item1”、“Item2”等 看一下,我有以下功能:如何在.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
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
已经退出时,为什么要在.Net4.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)