为什么C#lambda表达式不能由一个简单的if语句组成,而不需要大括号?

RLH*_*RLH 22 c# lambda

请考虑以下分配给事件的lambda表达式.

foo.BarEvent += (s, e) => if (e.Value == true) DoSomething();
Run Code Online (Sandbox Code Playgroud)

这看起来很简单,只包含一行代码.那么为什么我从调试器中得到以下2个错误?

无效的表达式术语'if'


只有赋值,调用,递增,递减,等待和新对象表达式才能用作语句

要解决此问题,您所要做的就是用if括号括起您的语句.

foo.BarEvent += (s, e) => { if (e.Value == true) DoSomething(); };
//Errors now disappear!
Run Code Online (Sandbox Code Playgroud)

我理解这些错误消息的含义.我不明白的是为什么单条件if语句会成为编译器的问题,以及为什么第一个lambda赋值被认为是破坏的.

有人可以解释一下这个问题吗?

Cod*_*ter 37

没有{ }你声明一个表达式主体,{ }它是一个语句体.请参阅Lambda表达式(C#编程指南):

  • 一个表达式拉姆达返回表达式的结果

  • 语句拉姆达类似于表达式拉姆达除了语句(多个)被包围在括号[...]的声明拉姆达的主体可以由任何数量的语句的.

因此,如果您需要语句而不是表达式,请使用大括号.

  • 它不是"如果你想要多个语句......",它更简单地"如果你想要一个*语句*而不是一个*表达式*......" (12认同)
  • @RLH我认为如果你阅读更多关于语句和表达的内容以及两者之间的区别,我会更好地理解这个问题. (3认同)
  • 我知道了.这当然有助于澄清情况.所以底线是,如果"代码行"没有计算到最终值,请将其包装在括号中.我假设这是因为编译器解释括号实际上意味着`void(s,e){...}`在操作后返回一个`void`指针. (2认同)
  • @RLH它根本不需要是无效的.它里面可以有一个`return`关键字.同样,表达式lambda可以很容易地解析为"void". (2认同)

Dam*_*ver 9

请参阅Lambda表达式.

有两种类型的lambdas,Expression Lambdas(no {})和Statement Lambdas(with {}).

它们之间的主要区别在于Expression Lambdas被定义为返回由右侧计算的.但这if()是一种陈述,而不是表达.没有与之相关的价值if.您会注意到您提供的错误消息中的所有"允许"语言元素都是表达式:它们计算一个.