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