Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带花括号的C#语法lambdas_C#_Syntax_Lambda - Fatal编程技术网

带花括号的C#语法lambdas

带花括号的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是等效的。在句法上,为什么它是必要的
在第二个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; }