在表达式中保证顺序

Joh*_*son 17 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);
}
Run Code Online (Sandbox Code Playgroud)

ListEqualByComparer.TryGetOrCreate始终被调用之前EnumerableEqualByComparer.TryGetOrCreate

Jon*_*eet 29

ListEqualByComparer.TryGetOrCreate始终被调用之前EnumerableEqualByComparer.TryGetOrCreate

是的,并且正如||短路一样,只有在第一次呼叫返回时才会进行第二次呼叫false.

从C#5规范,第7.12.1节:

当操作数为&&或者||是类型bool的操作数时,或者操作数是没有定义适用的类型,operator &或者operator |确实定义了隐式转换时bool,操作按如下方式处理:

[...]

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

  • @JohanLarsson:添加了规范参考. (2认同)
  • @Veksi C++在处理内置的&&/II时具有与C#相同的规则,但是当`operator &&`被重载时它确实*不*提供相同的保证(这就是为什么你强烈*建议不要超载的原因) operator &&`).OTOH给出`foo(bar(),baz())`,我很确定C#保证`bar`将在`baz`之前被调用,但C++没有. (2认同)