为什么匿名委托可以省略参数,但lambdas不能?

时间:2012-02-16 16:31:11

标签: c# delegates lambda arguments

//ok
Action<int> CallbackWithParam1 = delegate { };    

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

只是想知道为什么差异真的。 : - /

2 个答案:

答案 0 :(得分:16)

贾里德当然是对的。要添加更多详细信息:

  • 几乎没有人使用“跳过参数列表”语法。
  • 我们没有需要该功能的lambda的情况。
  • 该功能使类型推断和重载决策变得复杂,并且更有可能两者都失败。
  • 您希望该功能使用什么语法? Action<int> c = => {}; ???我并不希望将=>变成一元前缀运算符。

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

  • Lambdas与不必要的人知道或使用的不必要的C#2.0功能保持一致 - 坦率地说,我们希望我们从未在第一时间做过这个功能

和缺点:

  • 实现使已经复杂的类型推断和重载决策算法复杂化
  • 功能会为用户带来更多的bug可能性,而代表能力则没有相应的增益。
  • 没有明显好的语法

如果给你那份利弊清单,你会怎么做?我希望“实现功能”不是你的选择;它不是我们的。

答案 1 :(得分:6)

它基本上就像它们是具有不同支持方案集的不同功能一样简单。这几乎就像问

  

为什么lambda是表达式,但委托只能是块?