2017-05-11 44 views
2

我是VB.net的新手,目前正在編寫一些常見構造的代碼示例(這不會有任何意義),我可能需要在即將推出的項目中使用。我有lambda表達式一類爲屬性,它看起來像這樣:vb.net lambda太多的參數

Namespace SampleClasses 
    Public Class Lambdas 
     Public Shared ReadOnly Property AddFromZeroUpTo As Func(Of Integer, Integer) 
      Get 
       Return Function(upTo As Integer) Enumerable.Range(0, upTo + 1).Sum() 
      End Get 
     End Property 

     Public Shared ReadOnly Property ShowMessageBox As Action(Of String) 
      Get 
       Return Function(text As String) MessageBox.Show(text) 
      End Get 
     End Property 
    End Class 
End Namespace 

現在,當我嘗試調用這些lambda表達式一些線工作,有的不會,我真的不知道爲什麼。

SampleClasses.Lambdas.ShowMessageBox()(SampleClasses.Lambdas.AddFromZeroUpTo(8)) 'works 
SampleClasses.Lambdas.ShowMessageBox(SampleClasses.Lambdas.AddFromZeroUpTo(8)) 'wont work 
SampleClasses.Lambdas.AddFromZeroUpTo(8) 'wont work 
SampleClasses.Lambdas.AddFromZeroUpTo()(8) 'works 
Dim msg = SampleClasses.Lambdas.ShowMessageBox 
msg(SampleClasses.Lambdas.AddFromZeroUpTo(8)) 'works 

我真的在這個行爲難倒和不知道爲什麼這樣的行爲就這樣,感謝您的任何建議要尋找什麼,或解釋。

+2

在VB.NET中(與C#不同),屬性可以有參數。所以語法是不明確的,當你使用AddFromZeroUpTo(8)時,編譯器認爲你正在試圖傳遞8給屬性getter。你必須通過使用()(8)來解決模糊性,現在編譯器確信你打算把8傳遞給委託。那麼,清理這裏窗口的語法。 –

回答

0

ShowMessageBox和AddFromZeroUpTo都是屬性。它們被定義爲ReadOnly並返回某種類型的委託。
所以你得到這些屬性的值並調用返回的委託。
你不能將任何東西傳遞給這些屬性,就像它們是方法一樣。

如果添加了Invoke方法在您的通話隱含你

' Get the delegate returned and invoke it 
Lambdas.ShowMessageBox.Invoke(Lambdas.AddFromZeroUpTo(8)) 

' Doesn't make sense. ShowMessageBox is a read only property 
'Lambdas.ShowMessageBox(Lambdas.AddFromZeroUpTo(8)) 'wont work 

' Use the delegate returned from AddFromZeroUp 
Lambdas.AddFromZeroUpTo.Invoke(8) 

' That's the same as above with the Invoke omitted 
Lambdas.AddFromZeroUpTo()(8) 

' First calls the delegate returned by 
' AddFromZeroUpTo and with the return value calls the delegate returned 
' by ShowMessageBox 
Dim msg = Lambdas.ShowMessageBox 
msg(Lambdas.AddFromZeroUpTo(8)) 

注意,這個代碼僅適用,如果你有選項嚴格上關閉您的項目。從許多角度來看,這是非常不明智的舉動。