没有参数的Lambda在VB中有效,但在C#中无效

ror*_*.ap 1 c# vb.net lambda delegates

在VB中,我可以这样做:

Dim a = New Action(Of String)(
        Sub()
            Debug.Print("Hello World.")
        End Sub)
Run Code Online (Sandbox Code Playgroud)

但是在C#中我无法做到这一点,这对我来说很有意义,因为lambda定义应该与委托匹配:

var a = new Action<string>(() => 
{
    System.Diagnostics.Debug.Print("Hello World.");
});
Run Code Online (Sandbox Code Playgroud)

不能在VB中做到这一点,这很有意义。

var a = new Action<string>(() => 
{
    System.Diagnostics.Debug.Print("Hello World.");
});
Run Code Online (Sandbox Code Playgroud)

那么,为什么VB允许出现这样一种异常情况,即您可以提供一个不带参数但似乎与委托人不兼容的lambda表达式?

Mar*_*zek 5

宽松的委托转换(Visual Basic)

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

(...)

宽松的委托还使您可以完全忽略分配的方法中的参数规范:

它还描述了为什么可能会有帮助:

忽略参数的功能在诸如定义事件处理程序(其中涉及多个复杂参数)的情况下很有用。某些事件处理程序的参数未使用。而是,处理程序直接访问在其上注册事件的控件的状态,并忽略参数。宽松的委托使您可以在不产生歧义的情况下忽略此类声明中的参数。在下面的示例中,可以将完全指定的方法OnClick重写为RelaxedOnClick。

  • 匿名委托允许您省略所有参数,例如`new Action &lt;string&gt;(delegate {})`。 (2认同)