C#语法lambda与花括号

时间:2014-02-13 16:06:50

标签: c# syntax lambda

delegate int AddDelegate(int a, int b);
AddDelegate ad = (a,b) => a+b;


AddDelegate ad = (a, b) => { return a + b; };

以上两个版本的AddDelegate是等效的。从语法上讲,为什么有必要 在第二个AddDelegate中}之前和之后有一个分号?如果缺少任何一个,您可以编译错误; expected

3 个答案:

答案 0 :(得分:8)

也许这会让它更清晰:

AddDelegate ad = (a, b) =>
                 {
                     return a + b;
                 };

这些分号有效地针对不同的行。

答案 1 :(得分:8)

语句lambda 包含一个语句块 ...这意味着每个语句都需要一个语句终止符。请注意,这类似于C#2中的匿名方法:

AddDelegate ad = delegate(int a, int b) { return a + b; };

将其视为方法体,因此:

AddDelegate ad = GeneratedMethod;
...
private int GeneratedMethod(int a, int b) { return a + b; }

注意原始lambda表达式或匿名方法中的最后一个分号是赋值语句的终止符。块内的分号是return语句的终止符。

表达式lambda 只包含一个表达式...这意味着你不要需要一个语句终止符。

他们只是两种不同形式的lambda表达。有关详细信息,请参阅MSDN。如果您只有一个语句并且不想包含分号,那么只需使用表达式lambda:)

请注意,语句lambdas目前无法转换为表达式树。

答案 2 :(得分:2)

使用花括号允许lambda表达式中的多个语句。这就是为什么需要使用半冒号来表示花括号中语句的结束。