调用匿名方法

时间:2013-03-21 19:14:39

标签: vb.net

第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()

2 个答案:

答案 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行。猜测,属性访问比函数调用更强(如果这些是正确的术语)。