为什么在C#单表达式lambda方法和Expression-bodied方法中使用'if'不起作用?

时间:2016-02-20 17:19:17

标签: c# lambda compilation

我在一些新的C#6.0功能上观看了Mads视频。 https://channel9.msdn.com/Series/Visual-Studio-2015-Enterprise-Videos/Whats-New-in-CSharp-6#time=0s

在大约2:40,他谈到只有一个表达式的方法可以使用lambda表示法压缩,如下所示

void DoSomething() => "".Count();

这是基于单个表达式lamdba的基础:

Action doSomething = () => "".Count();

然后我尝试在之前快速放入if和C#6.0简写方法,如果'在类,结构或接口成员声明中'消息,我会得到旧的“无效标记”。 例如:

void DoSomething() => if(true) "".Count(); //Problem!

然后我想知道在C#5.0中是否曾经使用单个表达式lamdba来支持....当然,它从来没有,当我这样做时,我得到同样的错误:

Action doSomething = () => if(true) "".Count(); //Also problem!

所以,我唯一的结论是if(true) executeExpression();不算作“单一表达主体”和/或C#规范对什么限定单个表达式主体以限制魔法的复杂性有限制编译器必须做到这一点。

我原以为ifforforeachtryusing等会起作用,但我理解必须要有的复杂性处理这些嵌套块。

1 个答案:

答案 0 :(得分:1)

这就是名称:“表达式方法”。 if不是表达式,它是语句,这就是为什么在表达式身体方法中使用它是无效的。

这种区别很重要的另一个案例是throwthrow也是一个声明,这意味着您目前无法在表达式身体方法中使用它:

void M() => throw new NotImplementedException();

出于这个原因,throw is being considered to be made into an expression in C# 7