当前位置 : 主页 > 编程语言 > c语言 >

.net – 委托签名不匹配时没有错误

来源:互联网 收集:自由互联 发布时间:2021-06-24
我在代码中定义了以下类和委托(为简洁起见,还有许多其他行被删除). 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#中执行相同的操作.
网友评论