【问题标题】:Lambda with no argument works in VB but not in C#没有参数的 Lambda 在 VB 中有效,但在 C# 中无效
【发布时间】:2015-01-13 18:50:17
【问题描述】:

在 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 表达式的异常情况?

【问题讨论】:

  • Options Strict 开启了吗?
  • @JohnSaunders -- 是的。

标签: c# vb.net lambda delegates


【解决方案1】:

Relaxed Delegate Conversion (Visual Basic)

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

(...)

宽松的委托还允许您在分配的方法中完全省略参数说明:

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

省略参数的能力在以下情况下很有帮助 定义一个事件处理程序,其中有几个复杂的参数 涉及。不使用某些事件处理程序的参数。反而, 处理程序直接访问在其上的控件的状态 事件已注册,并忽略参数。轻松的代表 允许您在没有时省略此类声明中的参数 歧义的结果。在以下示例中,完全指定 方法 OnClick 可以重写为 RelaxedOnClick。

【讨论】:

  • 匿名委托允许您省略所有参数,例如new Action&lt;string&gt;(delegate {})
  • @vcsjones 不错!感谢您指出了这一点。声明已删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 2018-09-11
  • 2020-04-06
相关资源
最近更新 更多