C#lambda未命名参数

时间:2012-12-10 07:50:04

标签: c# parameters lambda

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

(_, foo) => bar(foo)
// or
(, foo) => bar(foo)

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

因此。我的用例有什么特殊的字符或表达吗?

4 个答案:

答案 0 :(得分:14)

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

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

implicit-anonymous-function-parameter:
  identifier

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

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:1)

在C#7中,您可以使用丢弃物。丢弃是只写的变量,您无法读取。它基本上适用于您不希望使用的变量 更多详情here

答案 3 :(得分:1)

现在可以了!

从C#9.0开始,现在您可以使用下划线字符放弃一个或多个lambda表达式参数。来自Microsoft Docs

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

Func<int, int, int> constant = (_, _) => 42;