没有参数的Lambda在VB中工作但在C#中不起作用

时间:2015-01-13 18:50:17

标签: c# vb.net lambda delegates

在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表达式,该表达式不带参数,但似乎与委托不兼容?

1 个答案:

答案 0 :(得分:5)

Relaxed Delegate Conversion (Visual Basic)

  

轻松的委托转换使您可以分配子和函数   代表或处理程序,即使他们的签名不相同。   因此,绑定到委托变得与绑定一致   已经允许进行方法调用。

     

(...)

     

宽松的代表还允许您在指定的方法中完全省略参数规范:

它还描述了可能有用的原因:

  

省略参数的能力在诸如此类的情况下很有用   定义一个事件处理程序,其中有几个复杂的参数   参与其中。不使用某些事件处理程序的参数。代替,   处理程序直接访问控件的状态   事件已注册,并忽略参数。轻松的代表   允许你在no时省略这些声明中的参数   模棱两可的结果。在以下示例中,完全指定   方法OnClick可以重写为RelaxedOnClick。