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

我在代码中定义了以下类和委托(为简洁起见,还有许多其他行被删除).

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#中执行相同的操作.

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...