![](/img/trans.png)
[英]How can I create anonymous method in a lambda expression using C# like I can in VB.NET?
[英]C# to VB - How do I convert this anonymous method / lambda expression across?
你會如何將它轉換為VB(使用.NET 4.0 / VS2010)?
bw.DoWork += (o, args) =>
{
Code Here
};
我想也許是這樣的:
AddHandler bw.DoWork,
Function(o, args)
Code Here
End Function
但它表示Function不會在所有代碼路徑上返回值。
想法?
你不能這樣做,但你可以讓它像:
Sub New()
AddHandler bw.DoWork, AddressOf Stuff
End Sub
Sub Stuff(ByVal o, ByVal args)
' Code Here '
End Sub
您基本上是添加一個調用代碼的事件,除了通過傳遞給例程的參數之外,沒有事件返回值。 這使它成為一個Sub而不是一個函數。
我嘗試使用.NET 4.0的Sub方式,並沒有得到任何錯誤
AddHandler bw.DoWork,
Sub(sender As Object, e As System.ComponentModel.DoWorkEventArgs)
'Code(Here)
End Sub
問題是我們需要知道“Code Here”的作用。 函數必須返回一個值(有一個Return語句)。 如果您不想返回值,那么您的Function需要是Sub。
在2010年之前你不會得到多行lambda。如果你必須在VB9中轉換多行,那么你必須做一些旋轉,但它可以完成。 您最終必須創建一個holder對象,在其上設置屬性,然后調用共享函數,而不是像C#中那樣優雅
嘗試在VBNET2008中使用lambda表達式時遇到了類似的東西。
由於關鍵字Function用於向編譯器指示使用lambda表達式,因此表達式必須返回一個值。 在這種情況下,使用關鍵字Sub會更合適,但在VBNET2008中還不可能。
VBNET2010應該通過在lambda表達式中允許Subs來解決這個問題。
這是一個解決方法的例子,在這個問題上對我來說非常有用: 這個C#的等效VB.NET代碼是什么...
簡而言之,您需要使用AddressOf Sub指向您希望執行工作的Sub,而不是將lambda表達式寫入方法的核心。
David Parvin也確實根據您的需要編寫了解決方法。
編輯:
您可以隨時選擇代理解決方案。 私人代表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的一部分,但我認為它們已經刪除了,但我是真的不太確定它是否堅定。
希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.