为什么在 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# 规范对什么是单个表达式主体有限制,以限制编译器为实现这一点而必须执行的魔法的复杂性。
我本以为if
、for
、foreach
、try
、using
等都可以工作,但我理解必须处理这些嵌套块的复杂性。
它就在名称中:"表达式体方法"。 if
不是一个表达式,它是一个语句,这就是为什么在表达式体方法中使用它无效的原因。
这种区别很重要的另一种情况是throw
。 throw
也是一个语句,这意味着您目前不能在表达式体方法中使用它:
void M() => throw new NotImplementedException();
因此,throw
被视为 C# 7 中的表达式。