次のクラスとデリゲートをコードで定義しています (簡潔にするために他の多くの行を省略しています)。
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
次のコードでタイマーの新しいインスタンスを作成すると、無名関数の署名がデリゲートの署名と一致しない場合でも、コンパイル エラーは発生しません (「ブール値としてキャンセル」パラメーターがありません)。
Dim timer As New Timer(Me.CookTime, Sub()
Dim cooked As FoodBase = CType(Activator.CreateInstance(SuccessfulResult), FoodBase)
player.GetBackpack.AddItem(cooked)
End Sub)
このようにタイマーをインスタンス化するとコンパイルエラーが発生すると予想されますが、エラーなしでコンパイルされている理由を誰でも説明できますか? コンパイル エラーが発生するように設定できるオプションはありますか? プロジェクトのプロパティには、オプションの明示的なオン、オプションの厳密なオン、およびオプションの推論オフがあります。そのままでは、キャンセルされた引数を含めるのを忘れがちです。