Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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#lambda未命名参数_C#_Parameters_Lambda - Fatal编程技术网

C#lambda未命名参数

C#lambda未命名参数,c#,parameters,lambda,C#,Parameters,Lambda,是否可以通过不给lambda表达式命名来丢弃它们? 例如,我必须通过一个动作,但我只对第二个参数感兴趣,我想写一些类似的东西 (u,foo)=>条形(foo) //或 (,foo)=>bar(foo) 在第一种情况下,它是有效的。但是第一个参数并不是真正未命名的,因为它的名称为“\ux”。所以当我想丢弃两个或更多的时候,它不起作用。我选择uu是因为在prolog中它有“任何值”的含义 所以。我的用例有什么特殊的字符或表达式吗 简单的回答是:不,您必须命名每个参数,并且名称必须是唯一的 您可以将

是否可以通过不给lambda表达式命名来丢弃它们? 例如,我必须通过一个动作,但我只对第二个参数感兴趣,我想写一些类似的东西

(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;