带花括号的C#语法lambdas
上述两个版本的AddDelegate是等效的。在句法上,为什么它是必要的带花括号的C#语法lambdas,c#,syntax,lambda,C#,Syntax,Lambda,上述两个版本的AddDelegate是等效的。在句法上,为什么它是必要的 在第二个AddDelegate中的}前后都有分号吗?您可以修改编译器错误;如果缺少其中一个,则应为。使用大括号可以在lambda表达式中使用多个语句。这就是为什么需要分号来用大括号表示语句的结尾。也许这样会更清楚: delegate int AddDelegate(int a, int b); AddDelegate ad = (a,b) => a+b; AddDelegate ad = (a, b) =>
在第二个AddDelegate中的
}
前后都有分号吗?您可以修改编译器错误;如果缺少其中一个,则应为
。使用大括号可以在lambda表达式中使用多个语句。这就是为什么需要分号来用大括号表示语句的结尾。也许这样会更清楚:
delegate int AddDelegate(int a, int b);
AddDelegate ad = (a,b) => a+b;
AddDelegate ad = (a, b) => { return a + b; };
这些分号实际上用于不同的行。语句lambda包含一个语句块。。。这意味着每个语句都需要一个语句终止符。请注意,这与C#2中的匿名方法类似:
将其视为一个方法体,因此:
AddDelegate ad = delegate(int a, int b) { return a + b; };
请注意,原始lambda表达式或匿名方法中的最后分号如何作为赋值语句的终止符。块中的分号是return语句的终止符
表达式lambda只包含一个表达式。。。这意味着您不需要语句终止符
它们只是lambda表达式的两种不同形式。有关更多详细信息,请参阅。如果您只有一条语句,并且不想包含分号,只需使用表达式lambda即可:)
请注意,语句lambda当前无法转换为表达式树。回答得好,一个用于委托声明和返回语句+1您能否解释语句lambda不转换为表达式树的重要性?这意味着您不能使用它们来查询数据源,对吗?@wootscootinboogie:这意味着您不能将它们用于
Queryable
(LINQ到SQL、EF等)-您仍然可以将它们用于使用可枚举的任何内容(LINQ到对象、LINQ到XML).是什么阻止语句lambda转换为表达式树?@wootscootinboogie:这不是C#编译器支持的部分。最初,表达式树甚至不能表示块;NET4修正了这一点,但没有足够有力的理由将需求添加到C#语言中。这是一个相当大的区别,如果你考虑你必须能够处理什么(循环、尝试/捕获、转到等)。
AddDelegate ad = delegate(int a, int b) { return a + b; };
AddDelegate ad = GeneratedMethod;
...
private int GeneratedMethod(int a, int b) { return a + b; }