.net - 委托(delegate)签名不匹配时没有错误

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

我在代码中定义了以下类和委托(delegate)(为简洁起见,剪掉了许多其他行)。

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

当我使用以下代码创建计时器的新实例时,即使匿名函数的签名与委托(delegate)的签名不匹配(它缺少“取消为 bool 值”参数),我也不会收到编译错误。
 Dim timer As New Timer(Me.CookTime, Sub()
                                         Dim cooked As FoodBase = CType(Activator.CreateInstance(SuccessfulResult), FoodBase)
                                         player.GetBackpack.AddItem(cooked)
                                     End Sub)

我希望以这种方式实例化计时器时会出现编译错误,谁能解释为什么编译时没有错误?有没有我可以设置的选项会导致它产生编译错误?我在项目属性中有选项显式打开、选项严格打开和选项推断关闭。事实上,忘记包含取消的参数太容易了。

最佳答案

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

关于.net - 委托(delegate)签名不匹配时没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13535899/

相关文章:

.net - libuv 与 asp.net core 2.1 中的套接字

.net - 确保每个子 UserControl 创建自己的 ViewModel 实例

vb.net - Winforms 表单继承 - 更改基本表单时继承的表单不会更新

c++ - 为什么VS2017协程不能返回void?

无法防止名称修改

c++ - Visual Studio 2010 不会自动链接来自依赖项的项目中的静态库,因为它应该是

c# - 公共(public)与私有(private){get, set}

.net - 在 32 位 Visual Studio 的同时在 64 位机器上进行调试

c# - 我对 .NET 串行端口类有奇怪的行为

c# - 使用 C# 合并具有相同名称的文件夹或子文件夹