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

C#到VB-如何转换此匿名方法/lambda表达式?,c#,vb.net,lambda,anonymous-methods,C#,Vb.net,Lambda,Anonymous Methods,如何将其转换为VB(使用.NET 4.0/VS2010) 我想可能是这样的: AddHandler bw.DoWork, Function(o, args) Code Here End Function 但它表示,函数不会在所有代码路径上返回值 想法? 有趣的是: (..)VB没有匿名方法,只有Lambda表达式(无法声明匿名操作委托) 问题是我们需要知道“这里的代码”是做什么的。函数必须返回一个值(具有return语句)。如果您不想返回值,那么您的函数需要

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

我想可能是这样的:

AddHandler bw.DoWork,
    Function(o, args)

        Code Here

    End Function
但它表示,函数不会在所有代码路径上返回值

想法?

有趣的是:

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


问题是我们需要知道“这里的代码”是做什么的。函数必须返回一个值(具有return语句)。如果您不想返回值,那么您的函数需要是一个子函数。

您不能这样做,但您可以让它像这样工作:

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

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

您基本上是在添加一个调用代码的事件,除了通过传递到例程中的参数之外,没有任何事件返回值。这使它成为一个子系统,而不是一个函数。

直到2010年,您才获得多行lambda。如果必须在VB9中转换多行,则必须进行一些旋转,但这是可以做到的。最后,您必须创建一个holder对象,在其上设置属性,然后调用一个共享函数,这远没有C#

中的优雅。我在VBNET2008中尝试使用lambda表达式时遇到了类似的情况

由于关键字函数用于向编译器指示使用了lambda表达式,因此该表达式必须返回一个值。在这种情况下,使用关键字Sub更合适,但在VBNET2008中还不可能

VBNET2010应该通过在lambda表达式中允许sub来解决这个问题

以下是一个解决方案的示例,在这个问题上对我非常有效:

简而言之,您不需要将lambda表达式写入方法的核心,而是需要使用AddressOf Sub指向您希望执行工作的Sub

David Parvin也完全按照您的需要编写了解决方案

编辑:

您始终可以选择代理解决方案。 私有委托子MyMethodAsync()

我知道这不是匿名方法,所以在VBNET中,即使是在2008年,您也可能很难用这种方式工作。这些功能应该是VBNET2010的一部分,但我认为他们删掉了它,但我真的不太确定是否可以肯定


希望这有帮助

我使用.NET4.0尝试了该子方法,没有得到任何错误

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

        'Code(Here)

    End Sub

本应为.Net 4添加这些功能,但该功能被删除:(@SLC答案是,在VB.NET中,除非委托返回一个值,否则不能使用lambda。您可以使用任何其他类型的委托。创建一个常规sub,然后将其用作委托。当然,d'oh!但是如果我将上面代码中的函数替换为sub,会对其进行排序吗?@SLC应该对其进行排序。让我们知道。:)看起来还可以,我必须完成整个应用程序的转换,然后才能运行和测试它。那么这是否意味着VB.NET确实支持这些东西?我不是100%支持所有的新东西,我现在只是在做盲转换。是的……事实上-在这种情况下,只需更改为Sub(我想,在c中的等价物是
操作
)应该有效。使用第三方LIB更痛苦。
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
AddHandler bw.DoWork,
    Sub(sender As Object, e As System.ComponentModel.DoWorkEventArgs)

        'Code(Here)

    End Sub