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

时间:2012-11-23 21:24:40

标签: .net vb.net visual-studio anonymous-function

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

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

当我使用以下代码创建一个新的计时器实例时,我没有得到编译错误,即使匿名函数的签名与委托的签名不匹配(它缺少“取消为布尔值”) PARAM)。

 Dim timer As New Timer(Me.CookTime, Sub()
                                         Dim cooked As FoodBase = CType(Activator.CreateInstance(SuccessfulResult), FoodBase)
                                         player.GetBackpack.AddItem(cooked)
                                     End Sub)

我希望以这种方式实例化计时器时会出现编译错误,任何人都能解释为什么编译没有错误吗?我可以设置任何可能导致编译错误的选项吗?我在项目属性中有选项显式,选项严格打开和选项推断。事实上,很容易忘记包括取消的论点。

2 个答案:

答案 0 :(得分:4)

是的。没关系 - 编译器可以生成一个匿名方法知道所需的签名,而不是使用它给出的参数。因此,编译器生成的方法将具有参数 - 它只是不会使用它。您可以使用delegate { ... }在C#中执行相同操作。

答案 1 :(得分:3)

这种现象称为Relaxed Delegate Conversion,当Option Strict为onoff时,其行为略有不同。请点击链接了解更多详情。

这是VB的一个特性,允许使用紧凑的代码,例如:

Private Sub Form1_Load() Handles MyBase.Load

如果您没有使用任何参数,为什么要将它们全部声明?我个人认为它是VB的一个好处,而不是一个问题。如果您尝试在C#中执行相同操作,则会出现如下编译错误:

  

'Form1_Load'没有重载与委托'System.EventHandler'匹配。