我有一个这样的表达式:
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
吗?
答案 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州:
逻辑运算符还保证从左到右评估其操作数。但是,它们会评估确定表达式结果所需的最小操作数。这被称为"短路"评价。因此,可能无法评估表达式的某些操作数。