C#Lambda表达式语法:括号是否必要?

时间:2010-06-05 13:26:55

标签: c# syntax lambda

我是C#的新手,早些时候我看到lambda表达式就像

(params) => { expression;}

但是在LINQ中,我看到了像

这样的例子
IEnumerable<string> customerFirstNames = customers.Select(cust => cust.FirstName);

没有括号。

它们是相同还是有区别?

非常感谢。

3 个答案:

答案 0 :(得分:25)

规则是:

lambda表达式的格式为

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

让我们先考虑左侧。

修饰符可以是ref,out或者根本没有。

如果没有ref或out修饰符,则可以省略所有类型。如果任何 ref或out修饰符,则每个参数声明必须具有声明的类型。如果任何参数具有声明的类型,则每个参数必须具有声明的类型。因此,您可以忽略所提供的类型(1)没有参考或出局,以及(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); }

当然这是非法的。

答案 1 :(得分:15)

你在谈论哪些括号? ( ){ }


( )在参数列表中使用,并且在您有多个参数时是必需的:

(a, b, c) => ...

只有一个参数时,可以省略它们:

a => ...

{ }允许您在lambda表达式的正文中放置语句块:

(a, b, c) => {
                 Console.WriteLine("Hello World!");
                 Console.WriteLine("a = {0}", a);
                 Console.WriteLine("b = {0}", b);
                 Console.WriteLine("c = {0}", c);
                 return a * b + c;
             }

没有它们,lambda表达式的主体是表达式

(a, b, c) => a * b + c

答案 2 :(得分:5)

如果您有多个参数,则只需要括号。

更新(按照惯例,在其他人回答之后编辑答案时就是这样......)

使用括号(括号“()”和大括号“{}”)这种情况是多余的。这些陈述是等同的。像ReSharper这样的Visual Studio加载项会指出这样的冗余:

http://www.jetbrains.com/resharper/