空合并运算符后面的表达式

时间:2015-05-29 22:43:12

标签: c# .net

我有下一个表达:

var max = items.FirstOrDefault(x => x.Key > date).Value;

if (max == null)
{
    max = items.FirstOrDefault(x => x.Key < date).Value;
}

我想以这种方式缩短它:

var max = 
    items.FirstOrDefault(x => x.Key > date).Value ?? // this line
    items.FirstOrDefault(x => x.Key < date).Value;   

这是问题:C#是否足够聪明,不能在三元运算符之前执行两次?

换句话说,我希望三元运算符不会转换为这样的东西:

var max = 
    items.FirstOrDefault(x => x.Key > date).Value == null ?
    items.FirstOrDefault(x => x.Key > date).Value : 
    items.FirstOrDefault(x => x.Key < date).Value;

1 个答案:

答案 0 :(得分:3)

您的术语已关闭。 ??运算符是 null coalescing 运算符。三元运算符实际上是第二个,即条件运算符:condition ? expression1 : expression2

空合并运算符未编译为三元条件表达式。它被明确指定为短路运算符。

来自C#规范:

  

形式为a ??的空合并表达式b要求a为可空类型或引用类型。如果a是非null,则结果为?? b是一个;否则,结果是b。仅当a为null时,操作才会计算b。

相比之下,示例中的条件运算符可能会执行两次“大于”查询。因此描述如下:

  

表格b的条件表达式? x:y首先评估条件b。然后,如果b为真,则评估x并成为操作的结果。否则,y被评估并成为操作的结果。条件表达式永远不会同时计算x和y。