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如果缺少任何一个,则可能发生编译错误.
也许这会让它更清晰:
AddDelegate ad = (a, b) =>
{
return a + b;
};
Run Code Online (Sandbox Code Playgroud)
这些分号有效地用于不同的行.
一个声明拉姆达包含块语句 ......这意味着你需要为每个语句语句终止.请注意,这类似于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当前无法转换为表达式树.