我可以使用lambda语法忽略委托参数吗?我很好奇为什么C#允许我在某些情况下忽略委托参数,而在其他情况下则不允许。例如,这是允许的:Actionaction=delegate{Console.WriteLine("delegate");};但这不是:Actionaction=()=>Console.WriteLine("lambda");有没有办法初始化委托并使用lambda忽略参数?我知道我可以向lambda添加一个参数并修复前一行,但这更多是关于编译器及其工作原因或工作方式的学术问题。我相信您的第一个示例实际上创建了一个能够采用许多不同签名的匿名函数,其主体是单个语句Console.WriteLine...因为它可以匹配不同的签名,所以不会引起问题。在第二个示例中,lambda语法本身定义了一个不接受同一主体参数的函数。显然后者与定义的Action不一致,所以你得到了错误。C#匿名方法参考在这种情况下,匿名方法提供的功能在lambda表达式中找不到。匿名方法允许您省略参数列表,这意味着匿名方法可以变成具有各种签名的委托。Lambda表达式无法做到这一点。详细说明tvanfosson的回答;此行为在C#3.0语言规范(第7.14节)中进行了描述:lambda表达式和匿名方法表达式的行为相同,但以下内容除外:?匿名方法表达式一种委托类型,允许参数列表是完全省略,从而转换为任何值参数列表。?lambda表达式允许省略和推断参数类型,而匿名方法表达式需要显式声明参数类型。?lambda表达式的主体可以是表达式或语句块,而匿名方法表达式的主体必须是语句块。?因为只有lambda表达式可以有表达式体,anonymous-method-expression不能成功地转换为表达式树类型(§4.6)。我认为:Actionaction=()=>Console.WriteLine("lambda");等同于:Actionaction=delegate(){Console.WriteLine("delegate");};这也不会编译。正如DanielPlaisted所说()明确表示没有任何参数。如果有等效的委托{},它可能是:Actionaction==>Console.WriteLine("lambda")这不是很漂亮,我怀疑它不符合lambda表达式的精神。正如其他人所说,不,您不能跳过将参数声明为lambda。但是,为了清洁起见,我建议给它们起一个像_这样的名字。例如foo.Click+=(_,__)=>{...}你本身并没有忽略它们,但你表明你不关心它们是什么,也不会使用它们。()=>...语法明确指定lambda不带参数。也许可以修改语言,使()=>真正意味着“为我推断此lambda的参数”,就像委托语法一样,但这会使语言更加复杂。当设计一个新的语言特性时,你从头开始,我认为这个不会通过测试。可能有更多的技术原因导致这难以实现(这可能更适合您的要求,但我怀疑技术原因会导致这个决定)。我会说必须使用lambda表达式的参数。以您的第一个示例为例,如果没有本机表示,您将如何与传入的值进行交互。这个如何?Funclamdapointer=()=>TwoArgMethodThatReturnsInt(10,20);//不能用委托“NoArgmethodThatReturnsInt”调用相同的方法lamdapointer();委托intNoArgmethodThatReturnsInt();NoArgmethodThatReturnsIntwithonthisReturnsIntdel=NoArgmethodThat委托publicintTwoArgMethodThatReturnsInt(intx,inty){returnx+y;}publicintNoArgmethodThatReturnsInt(){返回20;事实上,委托{}不指定任何参数并且适合任何委托方法签名-因此在您的A构造中允许它。Lambda表达式()=>...;专门声明了一个无参数委托,这与Action所需的签名相矛盾-具有单个参数的委托。您可能想要使用以下选项之一。如果你需要操作带参数,你可以走下一条路(“_”是标识符名称的合法字符)。动作动作=_=>Console.WriteLine("lambda");或者您可能希望使用无参数的Action,如下所示:Actionaction=()=>Console.WriteLine("lambda");以上是C#学习教程:CanIignoredelegateparametersusinglambdasyntax?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
