是否有可能通过不给它们命名来丢弃 lambda 表达式中的一些参数?例如,我必须传递一个 Action<int,int>,但我只对第二个参数感兴趣,我想写类似的东西
(_, foo) => bar(foo)
// or
(, foo) => bar(foo)
在第一种情况下,它正在工作。但第一个参数并不是真正的未命名,因为它的名称为“_”。因此,当我想丢弃两个或更多时,它不起作用。我选择 _ 因为在 prolog 中它具有“任何值”的含义。
所以。我的用例是否有任何特殊字符或表达式?
是否有可能通过不给它们命名来丢弃 lambda 表达式中的一些参数?例如,我必须传递一个 Action<int,int>,但我只对第二个参数感兴趣,我想写类似的东西
(_, foo) => bar(foo)
// or
(, foo) => bar(foo)
在第一种情况下,它正在工作。但第一个参数并不是真正的未命名,因为它的名称为“_”。因此,当我想丢弃两个或更多时,它不起作用。我选择 _ 因为在 prolog 中它具有“任何值”的含义。
所以。我的用例是否有任何特殊字符或表达式?
不,你不能。查看C# 语言规范语法,声明 lambda 有两种方式:显式和隐式。两者都不允许您跳过参数的标识符或重用标识符(名称)。
explicit-anonymous-function-parameter:
anonymous-function-parameter-modifieropt type identifier
implicit-anonymous-function-parameter:
identifier
与普通函数中未使用的函数参数相同。他们必须被命名。
当然,您可以将_其用作参数之一的名称,因为它是有效的 C# 名称,但这并不意味着什么特别。
从 C# 7 开始,_ 确实具有特殊含义。不适用于 lambda 表达式参数名称,但绝对适用于其他事物,例如模式匹配、解构、输出变量甚至常规赋值。(例如,您可以使用_= 5; 而不声明_。)
简短的回答是:不,您必须命名每个参数,并且名称必须是唯一的。
您可以将_其用作一个参数名称,因为它是 C# 中的有效标识符。
但是,您只能使用一次。
从 C# 9.0 开始,您可以使用下划线字符“丢弃”一个或多个lambda 参数。从微软文档:
从 C# 9.0 开始,您可以使用丢弃来指定 lambda 表达式的两个或多个未在表达式中使用的输入参数:
Func<int, int, int> constant = (_, _) => 42;
在 C# 7 中,您可以使用丢弃。丢弃是您无法读取的只写变量。它基本上适用于您不希望在此处使用更多详细信息的变量