2010-02-23 41 views

回答

3

VB.NET lacks this

有趣的位:

(..)VB不具有匿名方法,只有Lambda表達式(沒辦法來聲明一個匿名Action委託)。

+0

不是我問 – NibblyPig 2010-02-23 15:48:13

+0

他們應該被添加爲.NET 4,但該功能得到了削減:( – 2010-02-23 15:49:25

+0

@SLC答案是在VB.NET中你不能使用拉姆達,除非你的委託返回一個值,你可以使用任何其他類型的委託,創建一個常規的子然後使用它作爲你的代理 – 2010-02-23 15:50:57

1

的問題是,我們需要知道什麼是「代碼這裏」一樣。一個函數必須返回一個值(有一個返回語句)。如果你不想返回一個值,那麼你的函數需要是一個Sub。

+0

真的......實際上 - 對於這種情況,只要改變到Sub(我猜,在C#中等價物將會是「Action ')應該可以工作。第三方庫更加痛苦。 – 2010-02-23 15:53:47

3

你不能讓這樣的說法,但是你可以把它一樣工作:

Sub New()  
    AddHandler bw.DoWork, AddressOf Stuff  
    End Sub 

    Sub Stuff(ByVal o, ByVal args)  
    ' Code Here ' 
    End Sub 

你基本上將調用你的代碼的事件,除了通過傳入參數沒有事件返回一個值例程。這使得它不是一個功能。

0

你不要多拉姆達的到2010年。如果你要多轉換在VB9,那麼你必須做一些迴旋,但它可以做到的。你最終不得不創建一個持有者對象,設置屬性就可以了,然後調用共享的功能,幾乎沒有優雅,因爲它是在C#

0

我試圖VBNET2008使用lambda表達式時遇到了什麼一樣。

作爲關鍵字的功能是用於指示一個lambda表達式使用的編譯器,表達式必須返回一個值。在這種情況下,使用關鍵字Sub會更合適,但在VBNET2008中不可能。

VBNET2010應該通過允許lambda表達式中替補解決這個問題。

下面是我在這個問題上如此激動偉大的解決方法的一個例子:不是寫你的Lambda表達式到方法的核心 What would be the equivalent VB.NET code for this C#...

總之,你需要點你想分使用AddressOf Sub執行工作。

大衛·帕爾也還寫了一個解決辦法完全按照你需要它。

編輯:

你總是可以選擇委託的解決方案。 私人代表小組MyMethodAsync()

Public Sub Button1_Click(...) Handles Button1.Click 
    Dim myMethodAsync As MyMethodAsync = AddressOf MyDoWorkAsync 

    _myBackgroundWorker.RunWorkerAsync(myMethodAsync) 
    Dim loadingForm = New LoadingForm() 
    loadingForm.ShowDialog() 
End Sub 

Private Sub _myBackgroundWorker_DoWork([parameters here...]) Handles _myBackgroundWorker.DoWork 
    ' Do some stuff... 
End Sub 

我知道這是不是匿名的方法,因此你可以有一個真正艱難的時間努力工作,這樣在VBNET,甚至2008年。這些特徵都應該是VBNET2010的一部分,但我認爲他們把它切斷了,但我確實不確定是否確定。

希望這會有所幫助!

2

我嘗試使用.NET 4.0分方式沒有得到任何錯誤

AddHandler bw.DoWork, 
    Sub(sender As Object, e As System.ComponentModel.DoWorkEventArgs) 

     'Code(Here) 

    End Sub