I believe the following VB.Net code is the equivalent of the proceeding C# code; however the VB.Net test fails – the event handling Lambda is never called.
What is going on?
VB.Net version – fails:
<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
C# version – passes:
[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(); } }
The difference is that in VB.Net a lambda expression must return a value i.e. they must be functions not subs. The lambda expression
eventRaised = trueis being interpreted as a boolean expression rather than an assignment i.e. is evaluating to false rather than setting to true.Further details on MSDN.
I’m don’t think the c# pattern for testing events used in the example can be done in VB.Net without introducing another function e.g.