为什么在 C# 单表达式 lambda 方法和表达式体方法中使用“if”不起作用

本文关键字:方法 表达式 不起作用 if lambda 为什么 | 更新日期: 2023-09-27 18:35:39

我观看了 Mads 关于一些新的 C# 6.0 功能的视频。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 速记方法,我得到了很好的旧"类、结构或接口成员声明中的无效标记'if'"消息。前任:

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

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

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

因此,我唯一的结论是,if(true) executeExpression();不算作"单个表达式主体"和/或 C# 规范对什么是单个表达式主体有限制,以限制编译器为实现这一点而必须执行的魔法的复杂性。

我本以为ifforforeachtryusing等都可以工作,但我理解必须处理这些嵌套块的复杂性。

为什么在 C# 单表达式 lambda 方法和表达式体方法中使用“if”不起作用

它就在名称中:"表达式体方法"。 if 不是一个表达式,它是一个语句,这就是为什么在表达式体方法中使用它无效的原因。

这种区别很重要的另一种情况是throwthrow也是一个语句,这意味着您目前不能在表达式体方法中使用它:

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

因此,throw被视为 C# 7 中的表达式。