为什么匿名委托可以省略参数,而 lambda 不能

本文关键字:参数 不能 lambda 为什么 | 更新日期: 2023-09-27 18:24:47

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

只是想知道为什么真的有这种差异。

为什么匿名委托可以省略参数,而 lambda 不能

Jared当然是正确的。要添加更多详细信息:

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

因此,一方面,我们有优点列表:

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

缺点:

  • 实现使已经复杂的类型推理和重载解析算法复杂化
  • 功能为没有相应表示能力增益的用户带来了更多错误的可能性。
  • 没有明显好的语法

如果给你这份利弊清单,你会怎么做? 我希望"实现该功能"不是您的选择;这不是我们的。

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

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