Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么匿名委托可以省略参数,而lambdas可以';T //好的 Action CallbackWithParam1=委托{}; //错误CS1593:委托“System.Action”不接受0个参数 Action CallbackWithParam2=()=>{};_C#_Delegates_Lambda_Arguments - Fatal编程技术网

C# 为什么匿名委托可以省略参数,而lambdas可以';T //好的 Action CallbackWithParam1=委托{}; //错误CS1593:委托“System.Action”不接受0个参数 Action CallbackWithParam2=()=>{};

C# 为什么匿名委托可以省略参数,而lambdas可以';T //好的 Action CallbackWithParam1=委托{}; //错误CS1593:委托“System.Action”不接受0个参数 Action CallbackWithParam2=()=>{};,c#,delegates,lambda,arguments,C#,Delegates,Lambda,Arguments,我只是想知道为什么会出现这种差异-/ 它本质上是简单的,因为它们是具有不同支持场景集的不同功能。这几乎就像是在问 为什么lambda可以是表达式,而委托只能是块 贾里德当然是对的。要添加更多详细信息,请执行以下操作: 几乎没有人使用“跳过参数列表”语法 对于lambdas,我们没有需要该功能的场景 该特性使类型推断和重载解析复杂化,并使两者更可能失败 您希望该功能使用什么语法动作c==>{}???我根本不想把=>变成一元前缀运算符 因此,一方面,我们有专业人士的名单: Lambda与一个几

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

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

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


贾里德当然是对的。要添加更多详细信息,请执行以下操作:

  • 几乎没有人使用“跳过参数列表”语法
  • 对于lambdas,我们没有需要该功能的场景
  • 该特性使类型推断和重载解析复杂化,并使两者更可能失败
  • 您希望该功能使用什么语法<代码>动作c==>{}???我根本不想把
    =>
    变成一元前缀运算符
因此,一方面,我们有专业人士的名单:


  • Lambda与一个几乎没有人知道或使用的不必要的C#2.0特性取得了一致性——坦率地说,我们希望一开始就没有这样做过
缺点是:

  • 实现使已经很复杂的类型推断和重载解析算法复杂化
  • 该特性为用户带来了更多的bug可能性,但在表现力方面却没有相应的提升
  • 没有很好的语法

如果给你一张赞成和反对的清单,你会怎么做?我希望“实现该功能”不是您的选择;这不是我们的。

不幸的是,没有一个很好的理由,就像下面的@JaredPar所说的那样。只是遗漏了一些东西(不管是有意还是无意,我不确定)。这看起来像是一份。。。埃里克·利珀特@都铎在这里插入蝙蝠侠主题。“几乎没有人使用‘跳过参数列表’语法。”见鬼,我甚至不知道它的存在。“几乎没有人知道或使用”。。。但我已经看到了事件委托的语法,如
button1.Click+=delegate{MessageBox.Show(“Hello world”);}。这甚至是两个不同的人在回答我自己的问题时提出的()。你真的认为这是另一种情况吗?酷!看来我可以召唤埃里克·利珀特了@jmh_gr:这也是我在引发类似字段的事件时防止出现
NullReferenceException
的首选方法,方法是将支持字段初始化为
delegate{}
。非常感谢您的详细解释。我对无参数的lambdas没有任何强烈的欲望,只是无聊地想知道为什么会有差异,你已经完全回答了。谢谢
//ok
Action<int> CallbackWithParam1 = delegate { };    

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