当使用.NET进行委托签名时,若出现不匹配,系统为何不显示错误提示?
- 内容介绍
- 文章标签
- 相关推荐
本文共计384个文字,预计阅读时间需要2分钟。
我在代码中定义了以下类和委托:
Public Delegate Sub TimerCallback(canceled As Boolean)
Public Class Timer Implements TimerManager.ITimer Public Sub New(delay As Integer, callback As TimerCallback) ' ... End SubEnd Class
我在代码中定义了以下类和委托(为简洁起见,还有许多其他行被删除).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#中执行相同的操作.本文共计384个文字,预计阅读时间需要2分钟。
我在代码中定义了以下类和委托:
Public Delegate Sub TimerCallback(canceled As Boolean)
Public Class Timer Implements TimerManager.ITimer Public Sub New(delay As Integer, callback As TimerCallback) ' ... End SubEnd Class
我在代码中定义了以下类和委托(为简洁起见,还有许多其他行被删除).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#中执行相同的操作.
