C # для VB - Как я могу преобразовать этот анонимный метод / лямбда-выражения через? - PullRequest
3 голосов
/ 23 февраля 2010

Как бы вы конвертировали это в VB (используя .NET 4.0 / VS2010)?

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

Я подумал, может быть, так:

AddHandler bw.DoWork,
    Function(o, args)

        Code Here

    End Function

Но он говорит, что функция не возвращает значение для всех путей кода.

Идеи

Ответы [ 6 ]

3 голосов
/ 23 февраля 2010

Вы не можете сделать это таким образом, но вы можете заставить его работать так:

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

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

Вы в основном добавляете событие, которое вызывает ваш код, и никакое событие не возвращает значение, кроме как через переданные параметрыв рутине.Это делает его Sub, а не Function.

3 голосов
/ 23 февраля 2010

В VB.NET этого нет

Интересные биты:

(..) В VB нет анонимных методов, только лямбда-выражения (нет способа объявить анонимный делегат Action).

2 голосов
/ 13 марта 2012

Я пробовал Sub way с помощью .NET 4.0 и не получаю никаких ошибок

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

        'Code(Here)

    End Sub
1 голос
/ 23 февраля 2010

Проблема в том, что нам нужно знать, что делает «Код здесь». Функция должна возвращать значение (иметь оператор возврата). Если вы не хотите возвращать значение, то ваша функция должна быть Sub.

0 голосов
/ 23 февраля 2010

Я встречал что-то похожее, когда пытался использовать лямбда-выражения в VBNET2008.

Поскольку ключевое слово Function используется для указания компилятору, что используется лямбда-выражение, выражение должно возвращать значение. В этом сценарии использование ключевого слова Sub было бы более уместным, но это пока невозможно в VBNET2008.

VBNET2010 должен решить эту проблему, разрешив Subs в лямбда-выражениях.

Вот пример обходного пути, который отлично сработал для меня в этом вопросе о SO: Каким будет эквивалентный код VB.NET для этого C # ...

Короче говоря, вместо того, чтобы записывать свое лямбда-выражение в ядро ​​вашего метода, вам нужно указать Sub, с которым вы хотите выполнить работу, используя AddressOf Sub.

Дэвид Парвин также написал обходной путь именно так, как вам нужно.

EDIT:

Вы всегда можете выбрать решение для делегата. Частный делегат 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, но я думаю, что они его исключают, но Я действительно не достаточно уверен, чтобы подтвердить это твердо.

Надеюсь, это поможет!

0 голосов
/ 23 февраля 2010

Вы не получите многострочные лямбды до 2010 года. Если вам нужно конвертировать многострочные в VB9, то вам нужно выполнить несколько вращений, но это можно сделать. В конечном итоге вам нужно создать объект-держатель, задать для него свойства, а затем вызвать общую функцию, не такую ​​элегантную, как в C #

...