I have the following class and delegate defined in code (many other lines snipped out for brevity).
Public Delegate Sub TimerCallback(canceled As Boolean)
Public Class Timer
Implements TimerManager.ITimer
Public Sub New(delay As Integer, callback As TimerCallback)
mState = TimerState.Setup
mCallback = callback
CType(TimerManager.Instance, TimerManager.ITimerManager).RegisterTimer(Me, delay)
End Sub
End Class
When I create a new instance of the timer with the following code, I do NOT get a compile error, even though the signature of the anonymous function does not match the signature of the delegate (it's missing the "canceled as boolean" param).
Dim timer As New Timer(Me.CookTime, Sub()
Dim cooked As FoodBase = CType(Activator.CreateInstance(SuccessfulResult), FoodBase)
player.GetBackpack.AddItem(cooked)
End Sub)
I expect to get a compile error when instantiating the timer this way, can anyone explain why It is compiling without an error? Are there any options I can set that will cause it to produce a compile error? I have option explicit on, option strict on, and option infer off in the project properties. As it is, it is way too easy to forgot to include the canceled argument.
Yep. That's fine - the compiler can generate an anonymous method knowing the signature that is needed, and simply not use the parameters it is given. So the compiler-generated method will have the parameter - it just won't use it. You can do the same in C# using delegate { ... }
.
This phenomenon is called Relaxed Delegate Conversion, and has slightly different behavior when Option Strict is on
and off
. Please follow the link for more details.
It is a feature of VB, which allows for compact code, such as this:
Private Sub Form1_Load() Handles MyBase.Load
If you are not using any of the arguments, why declare them all? I personally see it as a benefit of VB, rather than a problem. If you attempt to do the same in C#, you get a compile error like this:
No overload for 'Form1_Load' matches delegate 'System.EventHandler'.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With