C#lambda未命名参数
是否可以通过不给lambda表达式命名来丢弃它们? 例如,我必须通过一个动作,但我只对第二个参数感兴趣,我想写一些类似的东西C#lambda未命名参数,c#,parameters,lambda,C#,Parameters,Lambda,是否可以通过不给lambda表达式命名来丢弃它们? 例如,我必须通过一个动作,但我只对第二个参数感兴趣,我想写一些类似的东西 (u,foo)=>条形(foo) //或 (,foo)=>bar(foo) 在第一种情况下,它是有效的。但是第一个参数并不是真正未命名的,因为它的名称为“\ux”。所以当我想丢弃两个或更多的时候,它不起作用。我选择uu是因为在prolog中它有“任何值”的含义 所以。我的用例有什么特殊的字符或表达式吗 简单的回答是:不,您必须命名每个参数,并且名称必须是唯一的 您可以将
(u,foo)=>条形(foo)
//或
(,foo)=>bar(foo)
在第一种情况下,它是有效的。但是第一个参数并不是真正未命名的,因为它的名称为“\ux”。所以当我想丢弃两个或更多的时候,它不起作用。我选择uu是因为在prolog中它有“任何值”的含义
所以。我的用例有什么特殊的字符或表达式吗 简单的回答是:不,您必须命名每个参数,并且名称必须是唯一的 您可以将
\u
用作一个参数名,因为它是C#中的有效标识符。
但是,您只能使用一次。不,您不能。从语法上看,有两种方法可以声明lambda:显式和隐式。两者都不允许您跳过参数的标识符或重用标识符(名称) 这与普通函数中未使用的函数参数相同。必须给他们起个名字 当然,您可以使用
\
作为其中一个参数的名称,因为它是一个有效的C#名称,但它并不意味着任何特殊的含义
从C#7开始,
确实有一个特殊的含义。不适用于lambda表达式参数名称,但绝对适用于其他内容,例如模式匹配、解构、输出变量甚至常规赋值。(例如,您可以使用\u
=5;无需声明\u
)在C#7中,您可以使用丢弃。丢弃是您无法读取的仅写变量。它基本上是针对您不希望使用的变量
更多详细信息现在您可以!
从C#9.0开始,现在可以使用下划线字符“放弃”一个或多个lambda参数。从
从C#9.0开始,可以使用丢弃来指定lambda表达式中未在表达式中使用的两个或多个输入参数:
Func常量=(,)=>42;
这就是为什么我经常以(uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuo)=>{…}
结束的原因。注意,lambda函数的丢弃在这个GitHub问题中被作为一种语言特性进行跟踪:
在C#7中有特殊的含义。不是用于lambda表达式参数名(据我所知),而是用于其他方面,例如模式匹配、解构、out
变量,甚至是常规赋值。(例如,您可以使用\=5;
而不声明\
)我知道这个答案是在C#7之前几年写的,但鉴于最后一行已经不正确,如果您有时间,最好编辑一下。@JonSkeet感谢您的注意,我在编辑中添加了您的评论。我需要更好地预测未来。我经常处于相同的位置——在这种情况下,我已经很久没有注意到这是一个古老的答案了。。。新的答案把这个问题放在了头版。总而言之,表达式new[]{1,2,3}.Select(=>DoStuff())
在语法上是正确的,但在语义上是错误的?我到处都能看到这个,刚刚发现了废弃模式。在我看来,不必在一个小小的lambda中塞满字符似乎是可行的#FirstWorldProblems这是真的,其他答案也忽略了这一点,但就我所知,这与lambda表达式参数无关。(例如,你不能使用(,,x)=>x
。@JonSkeet所以你不能使用这个?(u,foo)=>bar(foo)可以,但是\uu
只是一个常规参数。您不能使用(\uu,\ux)
,因为这样您将两次声明相同的参数。(你可以在模式中多次使用。@JonSkeet好的,现在我明白了
explicit-anonymous-function-parameter:
anonymous-function-parameter-modifieropt type identifier
implicit-anonymous-function-parameter:
identifier
Func<int, int, int> constant = (_, _) => 42;