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表达式?
轻松的委托转换使您可以将子和函数分配给委托或处理程序,即使它们的签名不相同。因此,与委托的绑定变得与方法调用已允许的绑定一致。
(...)
宽松的委托还使您可以完全忽略分配的方法中的参数规范:
它还描述了为什么可能会有帮助:
忽略参数的功能在诸如定义事件处理程序(其中涉及多个复杂参数)的情况下很有用。某些事件处理程序的参数未使用。而是,处理程序直接访问在其上注册事件的控件的状态,并忽略参数。宽松的委托使您可以在不产生歧义的情况下忽略此类声明中的参数。在下面的示例中,可以将完全指定的方法OnClick重写为RelaxedOnClick。