Phi*_*tle 3 c# lambda c#-6.0 visual-studio-2015 c#-7.0
此语句不在VS2015中编译,但在VS2017中编译:
var example = new Action( () => throw new Exception()
Run Code Online (Sandbox Code Playgroud)
解析labmdas的方式需要改变什么才能支持在labmda表达式中抛出异常?
特别是因为如果我使用lambda身体,VS2015非常高兴:
我的问题类似于为什么我不能从表达式身体成员中抛出异常?,但我的问题是,为什么.从lambda创建表达式树需要扩展编译器会发生什么?
小智 7
在C#6中,() =>必须跟着表达式.它可能是一个没有产生任何值的表达式,例如对返回类型为的方法的调用void,但这仍然是一个表达式.
在C#6中,throw只能出现在声明中.完整throw new Exception("test");是一个声明.注意那里的分号.语法中没有任何内容可以单独支持throw new Exception("test"),分号是其中不可或缺的一部分.
因此,为了使其工作,C#7必须允许语句之后() =>并且需要支持一种形式的语句而不终止;,或者C#7需要扩展表达式的定义以允许throw出现在那里.后者就是发生了什么.