【问题标题】:Why can anonymous delegates omit arguments, but lambdas can't?为什么匿名委托可以省略参数,而 lambdas 不能?
【发布时间】:2012-03-08 01:50:23
【问题描述】:
//ok
Action<int> CallbackWithParam1 = delegate { };    

//error CS1593: Delegate 'System.Action<int>' does not take 0 arguments
Action<int> CallbackWithParam2 = () => { };   

只是想知道为什么会出现这种差异。 :-/

【问题讨论】:

  • 不幸的是,没有一个很好的理由,就像@JaredPar 下面说的那样。只是省略了一些东西(我不确定是否有意)。
  • 这看起来像是给... Eric Lippert 人的工作!
  • @Tudor 在此处插入蝙蝠侠主题。

标签: c# delegates lambda arguments


【解决方案1】:

Jared 当然是正确的。添加更多细节:

  • 几乎没有人使用“跳过参数列表”语法。
  • 我们没有需要该功能的 lambdas 方案。
  • 该功能使类型推断和重载解析复杂化,并且更有可能两者都失败。
  • 您希望该功能的语法是什么? Action&lt;int&gt; c = =&gt; {}; ???我不想将=&gt; 变成一元前缀运算符。

所以一方面我们有专业人士的名单:

  • Lambda 与几乎没有人知道或使用的不必要的 C# 2.0 功能保持一致——坦率地说,我们希望我们一开始就不会这样做

和缺点:

  • 实现使已经很复杂的类型推断和重载解析算法变得复杂
  • 功能会为用户带来更多的错误可能性,而没有相应的代表性能力增益。
  • 没有明显好的语法

如果给你一份优缺点清单,你会怎么做?我希望“实现功能”不是您的选择;这不是我们的。

【讨论】:

  • "几乎没有人使用'跳过参数列表'语法。"哎呀,我什至不知道它的存在。
  • “几乎没有人知道或使用”......但我已经看到了 event 代表的语法,如button1.Click += delegate { MessageBox.Show("Hello world"); };。它甚至是由两个不同的人在回答我自己的问题时提出的(stackoverflow.com/questions/7530743/…)。你真的会考虑另一种情况吗?
  • 酷!看来我可以召唤 Eric Lippert!
  • @jmh_gr:这也是我在引发类似字段的事件时防止NullReferenceException 的首选方法,方法是将支持字段初始化为delegate { }
  • 非常感谢您的详细解释。我对无参数 lambda 没有任何强烈的渴望,只是想知道为什么会出现差异,您已经完全回答了。谢谢。
【解决方案2】:

它本质上很简单,因为它们是具有不同支持场景集的不同功能。这几乎就像在问

为什么 lambda 可以是表达式,而委托只能是块?

【讨论】:

    猜你喜欢
    • 2010-12-31
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    相关资源
    最近更新 更多