C#动作lambda限制

Jac*_*ter 16 c# compiler-construction lambda

为什么这个lambda表达式不能编译?

Action a = () => throw new InvalidOperationException();
Run Code Online (Sandbox Code Playgroud)

猜想很好,但我非常感谢对C#语言规范或其他文档的引用.

是的,我知道以下是有效的,并将编译:

Action a = () => { throw new InvalidOperationException(); };
Run Code Online (Sandbox Code Playgroud)

我将使用此类内容的上下文在此博客文章中进行了描述.

Jon*_*eet 19

嗯.我有答案,但不是很好.

我不相信有一个"抛出"的表达.有一个抛出语句,但不只是一个表达式.将其与"Console.WriteLine()"进行比较,后者是具有void类型的方法调用表达式.

作为并行,你不能将switch语句或if语句等作为lambda的主体.您只能有表达式或块(第7.14节).

这有什么帮助吗?


lep*_*pie 15

这是我的看法:

throw 是一种陈述,而不是一种表达.

参考:

12.3.3.11抛出语句

对于表单的语句stmt

throw expr;

expr开头的v的明确赋值状态与stmt开头的v的明确赋值状态相同.

为了解释这个本质,也许人们应该考虑C#lambda结构中表达式的含义.它只是语法糖:

delegate () { return XXX; }
Run Code Online (Sandbox Code Playgroud)

哪里XXX是表达