第4行和第5行之间的引擎盖是否有任何区别?
为什么VB.net不能处理第3行?
调用该函数的正确方法是什么?
Dim aFunc As New Tuple(Of Func(Of String))(Function() "Hello World")
Dim s As String
s = aFunc.Item1() 'does not compile
s = (aFunc.Item1)()
s = aFunc.Item1.Invoke()
答案 0 :(得分:3)
这对我来说看起来像编译器错误,括号应该明确地使它成为一个方法调用。然而,很难说明这一事实,parens在vb.net中严重超载意味着许多事情。很明显,它是使编译器摸索的元组,没有它就可以正常工作。本周与Eric Lippert btw的StackExchange播客出现了这个问题,你可能想听听它以获取它可能意味着的清单。
您可以将此帖子发布到connect.microsoft.com以获取语言设计人员的意见。这种行为当然不够直观,不能称之为bug。你找到的解决方法很好。两者都生成完全相同的代码并且不增加开销,您可以通过在程序集上运行ildasm.exe来查看。
答案 1 :(得分:2)
aFunc.Item1
是一个函数,因此您无法将其分配给String。你似乎想要:
Dim aFunc As New Tuple(Of Func(Of String))(Function() "Hello World")
Dim s As String
Dim f As Func(Of String) = aFunc.Item1
s = f.Invoke()
编辑:
s = aFunc.Item1()
访问属性Item1
。要调用该属性引用的函数,可以使用s = aFunc.Item1()()
,它等同于您的第4行。猜测,属性访问比函数调用更强(如果这些是正确的术语)。