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

LLS*_*LLS 14 c# syntax lambda

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

(params) => { expression;}
Run Code Online (Sandbox Code Playgroud)

但是在LINQ中,我看到了类似的例子

IEnumerable<string> customerFirstNames = customers.Select(cust => cust.FirstName);
Run Code Online (Sandbox Code Playgroud)

没有括号.

它们是相同的还是有什么区别?

非常感谢.

Eri*_*ert 25

规则是:

lambda表达式具有形式

( modifier type parameter, modifier type parameter ...) => { statements }
Run Code Online (Sandbox Code Playgroud)

我们先考虑左侧.

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

如果没有ref或out修饰符,则可以省略所有类型.如果有任何 ref或out修饰符,则每个参数声明必须具有声明的类型.如果任何参数具有声明的类型,则每个参数必须具有声明的类型.因此,您可以忽略以下类型:(1)没有参考或出局,以及(2)您忽略所有类型.否则,您必须提供所有类型.

如果只有一个参数并且其类型已被省略,那么也可以选择省略参数列表周围的括号.

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

如果语句列表包含带有表达式的单个return语句:

x => { return x + 1; }
Run Code Online (Sandbox Code Playgroud)

然后可以省略大括号,返回关键字和分号:

x => x + 1
Run Code Online (Sandbox Code Playgroud)

此外,如果语句列表由作为语句表达式的单个语句组成:

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.
Run Code Online (Sandbox Code Playgroud)

那么删除大括号和分号也是合法的:

x => x++
x => new Y(x)  
x => M(x)
Run Code Online (Sandbox Code Playgroud)

请注意,这些可能意味着与读者不同的东西!在我们清楚地丢弃返回值之前; 现在lambdas将被视为返回它们.

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

x => Console.WriteLine(x)
Run Code Online (Sandbox Code Playgroud)

呸.不要那样做.如果你的意思是

x => { Console.WriteLine(x); } 
Run Code Online (Sandbox Code Playgroud)

然后说出来.前者看起来太像你想说的那样

x => { return Console.WriteLine(x); }
Run Code Online (Sandbox Code Playgroud)

这当然是非法的.


dtb*_*dtb 15

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


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

(a, b, c) => ...
Run Code Online (Sandbox Code Playgroud)

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

a => ...
Run Code Online (Sandbox Code Playgroud)

{ }允许您在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;
             }
Run Code Online (Sandbox Code Playgroud)

没有它们,lambda表达式的主体就是一个表达式:

(a, b, c) => a * b + c
Run Code Online (Sandbox Code Playgroud)


Tim*_*oyd 5

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

更新(按照惯例,在其他人回答后编辑答案时,如此...)

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

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