Domanda

Credo che il seguente codice VB.Net sia l'equivalente del codice C # in corso; tuttavia il test VB.Net fallisce - l'evento che gestisce Lambda non viene mai chiamato.

Cosa sta succedendo?

Versione VB.Net - errore:

<TestFixture()> _
Public Class TestClass
    <Test()> _
    Public Sub EventTest()
        Dim eventClass As New EventClass
        Dim eventRaised As Boolean = False
        AddHandler eventClass.AnEvent, Function() (eventRaised = True)
        eventClass.RaiseIt()
        Assert.IsTrue(eventRaised)
    End Sub    
End Class

Public Class EventClass
    Public Event AnEvent()
    Public Sub RaiseIt()
        RaiseEvent AnEvent()
    End Sub
End Class

Versione C # - passa:

[TestFixture]
    public class TestClass
    {
        [Test]
        public void EventTest()
        {
            var eventClass = new EventClass();
            var eventRaised = false;
            eventClass.AnEvent += () => { eventRaised = true; }; 
            eventClass.RaiseIt();
            Assert.IsTrue(eventRaised);
        }
    }

    public class EventClass
    {
        public delegate void EventHandler();
        public event EventHandler AnEvent;
        public void RaiseIt()
        {
            AnEvent();
        }
    }
È stato utile?

Soluzione 2

  

Nota: si riferisce alle versioni precedenti di VB.net precedenti a Visual Studio 2010 e VB.net 10

La differenza è che in VB.Net un'espressione lambda deve restituire un valore, cioè devono essere funzioni non sottotitoli. L'espressione lambda eventRaised = true viene interpretata come un'espressione booleana anziché come un compito, ovvero sta valutando su falso anziché impostarlo su vero.

Ulteriori dettagli su MSDN .

Non credo che il modello c # per testare gli eventi usati nell'esempio possa essere fatto in VB.Net senza introdurre un'altra funzione, ad esempio

<TestFixture()> _
Public Class Test
    <Test()> _
    Public Sub EventTest()
        Dim eventClass As New EventClass
        Dim eventRaised As Boolean = False
        AddHandler eventClass.AnEvent, Function() (SetValueToTrue(eventRaised))
        eventClass.RaiseIt()
        Assert.IsTrue(eventRaised)
    End Sub

    Private Function SetValueToTrue(ByRef value As Boolean) As Boolean
        value = True
        Return True
    End Function

End Class

Public Class EventClass
    Public Event AnEvent()
    Public Sub RaiseIt()
        RaiseEvent AnEvent()
    End Sub
End Class

Altri suggerimenti

Per coloro che trovano questa domanda ora: da Visual Basic 2010 (VB 10.0), i Sub anonimi funzionano, quindi puoi scrivere qualcosa del tipo:

Sub() eventRaised = True

Per farla breve, al momento non è possibile farlo in VB (è nell'elenco delle funzionalità considerate per la prossima versione). Devi usare un metodo dichiarato e l'operatore AddressOf.

Il team di VB non ha avuto il tempo di includere delegati anonimi nella lingua (che è quello che stai cercando di usare, tecnicamente non un'espressione lambda).

Le espressioni Lambda che dovevano implementare in modo che Linq potesse effettivamente funzionare. I delegati anonimi non sono richiesti da nulla (ma sarebbero abbastanza utili). Immagino che abbiano speso più tempo a impacchettare cose come Linq To XML e XML e ad integrare più operatori di query nella sintassi ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top