C#语法lambda与花括号

woo*_*gie 4 c# syntax lambda

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


AddDelegate ad = (a, b) => { return a + b; };
Run Code Online (Sandbox Code Playgroud)

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

And*_*rei 8

也许这会让它更清晰:

AddDelegate ad = (a, b) =>
                 {
                     return a + b;
                 };
Run Code Online (Sandbox Code Playgroud)

这些分号有效地用于不同的行.


Jon*_*eet 8

一个声明拉姆达包含块语句 ......这意味着你需要为每个语句语句终止.请注意,这类似于C#2中的匿名方法:

AddDelegate ad = delegate(int a, int b) { return a + b; };
Run Code Online (Sandbox Code Playgroud)

把它想象成一个方法体,所以:

AddDelegate ad = GeneratedMethod;
...
private int GeneratedMethod(int a, int b) { return a + b; }
Run Code Online (Sandbox Code Playgroud)

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

一个表达式拉姆达只包含一种表达......这意味着你并不需要一个语句终止.

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

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