C#lambda未命名参数

Sve*_*übe 20 c# parameters lambda

有可能,通过不给它们一个名字来丢弃lambda表达式中的一些参数吗?例如,我必须传递一个Action <int,int>,但我只对第二个参数感兴趣,我想写一些像

(_, foo) => bar(foo)
// or
(, foo) => bar(foo)
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,它正在工作.但第一个参数并非真正未命名,因为它的名称为"_".所以它不起作用,当我想丢弃两个或更多.我选择_因为在prolog中它具有"任何价值"的含义.

所以.我的用例有什么特殊的字符或表达吗?

And*_*bel 15

不,你不能.查看C#语言规范语法,有两种方法可以声明lambdas:explicit和implicit.两者都不允许您跳过参数的标识符或重用标识符(名称).

explicit-anonymous-function-parameter:
  anonymous-function-parameter-modifieropt   type   identifier

implicit-anonymous-function-parameter:
  identifier
Run Code Online (Sandbox Code Playgroud)

它与普通函数中未使用的函数参数相同.他们必须得到一个名字.

当然你可以_用作其中一个参数的名称,因为它是一个有效的C#名称,但这并不意味着什么特别的.

从C#7开始,_ 确实有特殊含义.不适用于lambda表达式参数名称,但绝对适用于其他事物,例如模式匹配,解构,输出变量甚至常规赋值.(例如,您可以使用_= 5;无需声明_.)

  • `_`*确实*具有C#7的特殊含义.对于lambda表达式参数名称(据我所知)但绝对适用于其他事物,例如模式匹配,解构,`out`变量甚至常规赋值.(例如,您可以使用`_ = 5;`而不声明`_`.)我意识到这个答案是在C#7之前几年写的,但是考虑到最后一行变得不正确,如果编辑它,那将是很好的.你有时间. (4认同)

Nic*_*ler 7

简短的回答是:不,你必须命名每个参数,名称必须是唯一的.

您可以将其_用作一个参数名称,因为它是C#中的有效标识符.
但是,您只能使用一次.

  • 这就是为什么我常常以`(_,_ _,___,foo)=> {...}`结尾 (7认同)

Ami*_*adi 5

现在你可以!

从 C# 9.0 开始,您可以使用下划线字符“丢弃”一个或多个lambda 参数。来自微软文档

从 C# 9.0 开始,您可以使用丢弃来指定 lambda 表达式中未在表达式中使用的两个或多个输入参数:

Func<int, int, int> constant = (_, _) => 42;
Run Code Online (Sandbox Code Playgroud)