在表达式中保证顺序

时间:2016-04-06 10:09:15

标签: c# operator-precedence

我有一个这样的表达式:

EqualByComparer comparer;
if (ListEqualByComparer.TryGetOrCreate(x, y, out comparer) ||
    EnumerableEqualByComparer.TryGetOrCreate(x, y, out comparer))
{
    return comparer.Equals(x, y, compareItem, settings, referencePairs);
}

ListEqualByComparer.TryGetOrCreate之前始终会调用EnumerableEqualByComparer.TryGetOrCreate吗?

4 个答案:

答案 0 :(得分:29)

  

ListEqualByComparer.TryGetOrCreate之前始终会调用EnumerableEqualByComparer.TryGetOrCreate吗?

是的,当||短路时,只有在第一个呼叫返回false时才会进行第二次呼叫。

从C#5规范,第7.12.1节:

  

&&||的操作数类型为bool时,或者操作数类型未定义适用的operator &或{{1}时但是,确实将隐式转换定义为operator |,操作按如下方式处理:

     

[...]

     

操作bool评估为x || y。换句话说,首先评估x ? true : y并将其转换为x类型。然后,如果bool为真,则操作的结果为x。否则,true将被评估并转换为y类型,这将成为操作的结果。

答案 1 :(得分:4)

是 - 详细信息位于documentation

仅在第一个为假的情况下评估第二个条件

答案 2 :(得分:4)

来自C#参考(link):

  

条件OR运算符( || )执行其 bool 操作数的逻辑或。如果第一个操作数的计算结果为 true ,则不评估第二个操作数。如果第一个操作数的计算结果为 false ,则第二个操作符将确定整个OR表达式是否为 true false

答案 3 :(得分:3)

是的,订单有保证。 MSDN州:

  

逻辑运算符还保证从左到右评估其操作数。但是,它们会评估确定表达式结果所需的最小操作数。这被称为"短路"评价。因此,可能无法评估表达式的某些操作数。