在VB中,我可以这样做:
Dim a = New Action(Of String)(
Sub()
Debug.Print("Hello World.")
End Sub)
但是在C#中我无法做到这一点,这对我来说很有意义,因为lambda定义应该匹配委托:
var a = new Action<string>(() =>
{
System.Diagnostics.Debug.Print("Hello World.");
});
我不能在VB中执行此操作,这是有道理的。
Dim a = New Action(
Sub(x As String)
Debug.Print("Hello World.")
End Sub)
那么为什么VB允许一个异常情况,你可以提供一个lambda表达式,该表达式不带参数,但似乎与委托不兼容?
答案 0 :(得分:5)
Relaxed Delegate Conversion (Visual Basic)
轻松的委托转换使您可以分配子和函数 代表或处理程序,即使他们的签名不相同。 因此,绑定到委托变得与绑定一致 已经允许进行方法调用。
(...)
宽松的代表还允许您在指定的方法中完全省略参数规范:
它还描述了可能有用的原因:
省略参数的能力在诸如此类的情况下很有用 定义一个事件处理程序,其中有几个复杂的参数 参与其中。不使用某些事件处理程序的参数。代替, 处理程序直接访问控件的状态 事件已注册,并忽略参数。轻松的代表 允许你在no时省略这些声明中的参数 模棱两可的结果。在以下示例中,完全指定 方法OnClick可以重写为RelaxedOnClick。