如何将其转换为VB(使用.NET 4.0 / VS2010)?
bw.DoWork += (o, args) =>
{
Code Here
};
我想也许是这样的:
AddHandler bw.DoWork,
Function(o, args)
Code Here
End Function
但它表示Function不会在所有代码路径上返回值。
想法?
答案 0 :(得分:3)
答案 1 :(得分:3)
你不能这样做,但你可以让它像:
Sub New()
AddHandler bw.DoWork, AddressOf Stuff
End Sub
Sub Stuff(ByVal o, ByVal args)
' Code Here '
End Sub
您基本上是添加一个调用代码的事件,除了通过传递给例程的参数之外,没有事件返回值。这使它成为一个Sub而不是一个函数。
答案 2 :(得分:2)
我尝试使用.NET 4.0的Sub方式,不会出现任何错误
AddHandler bw.DoWork,
Sub(sender As Object, e As System.ComponentModel.DoWorkEventArgs)
'Code(Here)
End Sub
答案 3 :(得分:1)
问题是我们需要知道“Code Here”的作用。函数必须返回一个值(有一个Return语句)。如果您不想返回值,那么您的Function必须是Sub。
答案 4 :(得分:0)
直到2010年你才得到多行lambda。如果你必须在VB9中转换多行,那么你必须做一些回转,但它可以做到。你最终必须创建一个holder对象,在其上设置属性,然后调用一个共享函数,而不是像在C#中那样优雅,
答案 5 :(得分:0)
在尝试在VBNET2008中使用lambda表达式时,我遇到了类似的东西。
由于关键字Function用于向编译器指示使用lambda表达式,因此表达式必须返回一个值。在这种情况下,使用关键字Sub会更合适,但在VBNET2008中还不可能。
VBNET2010应该通过在lambda表达式中允许Subs来解决这个问题。
这是一个解决方法的例子,对于我在SO上的这个问题非常有用: What would be the equivalent VB.NET code for this C#...
简而言之,您需要使用AddressOf Sub指向您希望执行工作的Sub,而不是将lambda表达式写入方法的核心。
David Parvin也确实按照您的需要编写了解决方法。
修改强>
您可以随时选择代理解决方案。 Private Delegate 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的一部分,但我认为它们已经删除了,但是我真的不太确定它是否坚定。
希望这有帮助!