为什么在lambda中抛出一个C#7特性的异常?

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出现在那里.后者就是发生了什么.

  • 第一句话:"在C#7之前,[它]*必须遵循" - 但它仍然有,即使在C#7之后. (3认同)