2013-03-21 132 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