第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()
第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()
這看起來像是一個編譯器bug,括號應該明確表示一個方法調用。很難說這個事實,但是,parens是沉重重載在vb.net意味着很多事情。顯然它是使編譯器摸索的元組,它沒有它就可以正常工作。本週的StackExchange播客與Eric Lippert順便提一下,你可能想聽聽它,以獲得它可能意味着的東西。
您可以將此內容發佈到connect.microsoft.com以獲取語言設計者的意見。這種行爲絕對不夠直觀,稱之爲錯誤。您找到的解決方法很好。兩者都會生成確切的相同的代碼,並且不會增加任何開銷,通過在程序集上運行ildasm.exe可以看到。
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行。在猜測中,屬性訪問比函數調用(如果這些是正確的術語)更強。
或者只是'f()'。我認爲除了線程感知處理以外,您不需要'Invoke'。 – Neolisk
這並沒有真正回答這個問題 - 如果我理解正確,OP中的第4行和第5行工作正常,他只是對它們之間的差異感到好奇(以及爲什麼第3行沒有編譯)。 – Hannele