我在代码中定义了以下类和委托(为简洁起见,还有许多其他行被删除). Public Delegate Sub TimerCallback(canceled As Boolean)Public Class Timer Implements TimerManager.ITimer Public Sub New(delay As Integer, callback As
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)
我希望以这种方式实例化计时器时会出现编译错误,有人可以解释为什么编译时没有错误吗?我可以设置任何可能导致编译错误的选项吗?我在项目属性中有选项显式,选项严格打开和选项推断.事实上,忘记包含取消的参数太容易了.
是的.没关系 – 编译器可以生成一个匿名方法,知道所需的签名,而不是使用它给出的参数.因此编译器生成的方法将具有参数 – 它只是不会使用它.您可以使用委托{…}在C#中执行相同的操作.