2013-03-21 84 views
2

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

回答

3

这看起来像是一个编译器bug,括号应该明确表示一个方法调用。很难说这个事实,但是,parens是沉重重载在vb.net意味着很多事情。显然它是使编译器摸索的元组,它没有它就可以正常工作。本周的StackExchange播客与Eric Lippert顺便提一下,你可能想听听它,以获得它可能意味着的东西。

您可以将此内容发布到connect.microsoft.com以获取语言设计者的意见。这种行为绝对不够直观,称之为错误。您找到的解决方法很好。两者都会生成确切的相同的代码,并且不会增加任何开销,通过在程序集上运行ildasm.exe可以看到。

2

aFunc.Item1是一个函数,所以你不能把它分配给一个字符串。你似乎想:​​

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

+0

或者只是'f()'。我认为除了线程感知处理以外,您不需要'Invoke'。 – Neolisk

+0

这并没有真正回答这个问题 - 如果我理解正确,OP中的第4行和第5行工作正常,他只是对它们之间的差异感到好奇(以及为什么第3行没有编译)。 – Hannele