gpt4 book ai didi

C# Lambda 表达式语法 : are brackets necessary?

转载 作者:可可西里 更新时间:2023-11-01 07:49:32 26 4
gpt4 key购买 nike

我是 C# 的新手,之前我看到 lambda 表达式是这样的

(params) => { expression; }

但是在 LINQ 中,我看到了这样的例子

IEnumerable<string> customerFirstNames = customers.Select(cust => cust.FirstName);

没有括号。

(我实际上是指 {}() - 不管我们称它们为大括号、圆括号还是方括号。)

它们是一样的还是有什么区别?

非常感谢。

最佳答案

规则是:

lambda 表达式的形式为

( modifier type parameter, modifier type parameter ...) => { statements }

让我们先考虑左侧。

修饰符可以是 ref、out 或什么都不是。

如果没有 ref 或 out 修饰符,则可以省略所有类型。如果有任何 ref 或out 修饰符,则每个 参数声明都必须有声明的类型。如果任何 参数具有声明的类型,则每个 参数都必须具有声明的类型。因此,您可以省略类型,前提是 (1) 没有 refs 或 outs,并且 (2) 您省略所有它们。否则,您必须提供所有类型。

如果恰好有一个参数并且其类型已被省略,则参数列表周围的括号也可以选择性地被省略。

这就是关于参数列表的所有规则。关于右侧的规则是:

如果语句列表由带有表达式的单个 return 语句组成:

x => { return x + 1; }

那么大括号、返回关键字和分号可以省略:

x => x + 1

此外,如果语句列表由单个语句组成,该语句是语句表达式:

x => { x++; } // Not returning the value of x++; only useful for the side effects
x => { new Y(x); } // weird! executing a ctor only for its side effects! But legal!
x => { M(x); } // note, not returning the value of M(x) even if there is one.

那么省略大括号和分号也是合法的:

x => x++
x => new Y(x)
x => M(x)

请注意,这些现在可能对读者意味着不同的东西!在我们明确丢弃返回值之前;现在 lambda 将被读取为返回它们。

请注意,这意味着使用 void 返回方法执行此技巧是合法的。这实际上是合法的:

x => Console.WriteLine(x)

哎呀。 不要那样做。如果你的意思是

x => { Console.WriteLine(x); } 

然后再说。前者看起来太像你想说的了

x => { return Console.WriteLine(x); }

这当然是非法的。

关于C# Lambda 表达式语法 : are brackets necessary?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2980512/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com