C#到VB - 如何将此匿名方法/ lambda表达式转换为?

时间:2010-02-23 15:45:33

标签: c# vb.net lambda anonymous-methods

如何将其转换为VB(使用.NET 4.0 / VS2010)?

bw.DoWork += (o, args) =>
{
     Code Here
};

我想也许是这样的:

AddHandler bw.DoWork,
    Function(o, args)

        Code Here

    End Function

但它表示Function不会在所有代码路径上返回值。

想法?

6 个答案:

答案 0 :(得分:3)

VB.NET lacks this

有趣的位:

  

(..)VB没有匿名方法,只有Lambda表达式(无法声明匿名Action委托)。

答案 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的一部分,但我认为它们已经删除了,但是我真的不太确定它是否坚定。

希望这有帮助!