delegate int AddDelegate(int a, int b);
AddDelegate ad = (a,b) => a+b;
AddDelegate ad = (a, b) => { return a + b; };
以上两个版本的AddDelegate是等效的。从语法上讲,为什么有必要
在第二个AddDelegate中}
之前和之后有一个分号?如果缺少任何一个,您可以编译错误; expected
。
答案 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表达式中的多个语句。这就是为什么需要使用半冒号来表示花括号中语句的结束。