我有下一个表达:
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;
答案 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。