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

Gaz*_*yer 19 c# lambda delegates arguments

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

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

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

Eri*_*ert 16

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

  • 几乎没有人使用"跳过参数列表"语法.
  • 我们没有lambda 需要该功能的场景.
  • 该功能使类型推断和重载分辨率复杂化,并使两者都更有可能失败.
  • 您希望该功能使用什么语法? Action<int> c = => {};??? 我没有任何想要=>成为一元前缀运算符的愿望.

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

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

和缺点:

  • 实现使已经复杂的类型推断和重载决策算法复杂化
  • 功能导致用户更多的bug可能性,代表功率没有相应的增益.
  • 没有明显好的语法

如果你被列出了利弊列表,你会做什么?我希望"实现功能"不是你的选择; 这不是我们的.

  • 凉!看来我可以召唤Eric Lippert! (6认同)
  • "几乎没有人使用'跳过参数列表'语法." 哎呀,我甚至都不知道它存在. (4认同)
  • "几乎没有人知道或使用"......但我已经看到_event_委托的语法,如`button1.Click + = delegate {MessageBox.Show("Hello world"); };`.甚至有两位不同的人回答我自己的问题(http://stackoverflow.com/questions/7530743/c-sharp-add-event-handler-literal-code-block).你真的会考虑另一种情况吗? (3认同)

Jar*_*Par 6

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

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