3

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

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

我想可能是这样的:

AddHandler bw.DoWork,
    Function(o, args)

        Code Here

    End Function

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

想法?

4

6 回答 6

3

VB.NET 缺少这个

有趣的位:

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

于 2010-02-23T15:46:04.330 回答
3

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

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

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

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

于 2010-02-23T15:58:51.230 回答
2

我尝试了使用 .NET 4.0 的 Sub 方式,但没有出现任何错误

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

        'Code(Here)

    End Sub
于 2012-03-13T17:35:19.990 回答
1

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

于 2010-02-23T15:49:32.047 回答
0

直到 2010 年你才会得到多行 lambda。如果你必须在 VB9 中转换多行,那么你必须做一些旋转,但它可以做到。你最终不得不创建一个持有者对象,在其上设置属性,然后调用一个共享函数,这不像在 C# 中那样优雅

于 2010-02-23T16:03:50.507 回答
0

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

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

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

这是一个解决方法的示例,它对我在这个关于 SO 的问题非常有用: What would be the equivalent VB.NET code for this C#...

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

David Parvin 也确实根据您的需要编写了解决方法。

编辑:

您总是可以选择委托解决方案。私人委托子 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 的一部分,但我认为他们删掉了,但我实在不敢肯定地确认。

希望这可以帮助!

于 2010-02-23T16:18:31.260 回答