Подтвердить что ты не робот

Гарантируется ли заказ в выражении или выражении

У меня есть выражение, подобное этому:

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?

4b9b3361

Ответ 1

Всегда будет вызываться ListEqualByComparer.TryGetOrCreate до EnumerableEqualByComparer.TryGetOrCreate?

Да, а при || закорачивается, второй вызов будет выполнен только в том случае, если первый вызов возвращает false.

Из спецификации С# 5, раздел 7.12.1:

Когда операнды && или || имеют тип bool или когда операнды относятся к типам, которые не определяют применимые operator & или operator |, но определяют неявные преобразования в bool, операция обрабатывается следующим образом:

[...]

Операция x || y оценивается как x ? true : y. Другими словами, x сначала оценивается и преобразуется в тип bool. Тогда, если x истинно, результатом операции является true. В противном случае y оценивается и преобразуется в тип bool, и это становится результатом операции.

Ответ 2

Да - подробности находятся в документации.

Второе условие оценивается только в том случае, если первое значение false

Ответ 3

Из ссылки С# (ссылка):

Оператор условного-OR (||) выполняет логическое ИЛИ своих операндов bool. Если первый операнд оценивает значение true, второй операнд не оценивается. Если первый операнд оценивается как false, второй оператор определяет, будет ли выражение OR в целом оцениваться как true или false.

Ответ 4

Да, заказ гарантирован. MSDN:

Логические операторы также гарантируют оценку их операндов слева направо. Тем не менее, они оценивают наименьшее количество операндов, необходимых для определения результата выражения. Это называется оценкой "короткого замыкания". Таким образом, некоторые операнды выражения не могут быть оценены.