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

Попытка понять, почему resharper сказал мне, что выражение всегда ложно

У меня есть условие, которое я пишу, проверяя три вещи.

if(LoggedInMembershipUser == null || obj == null || boolVal)

в этом случае "LoggedInMembershipUser" - это только членство. GetUser(), "obj" - это некоторый случайный бизнес-объект, а "boolVal", очевидно, является логическим. Когда я пишу выражение, как указано выше, resharper говорит мне, что часть boolVal инструкции всегда ложна. Но когда я ставлю boolVal в начале, как ниже, я не получаю этого уведомления.

if(boolVal|| LoggedInMembershipUser == null || obj == null)

Почему первый всегда будет ложным, а второй - не?

EDIT: Это в привязке данных к строкам сетки. Сетка отображает результаты двух объектов с одним и тем же базовым классом, поэтому "obj" будет иметь значение, если это один из типов объектов, но не другой. boolVal - индикатор, для какого типа объекта это так, теперь, когда я думаю об этом, я думаю, если obj равно null, тогда boolVal всегда будет true. Был ли решар, понимая, что некоторые как? О, я уверен, это было потому, что я смотрел на мой код выше строки, которую у меня есть:

if (!uploaded){
    var obj = GetObjectLogic();
}

Хорошо спасибо за комментарии к комментариям. Я думаю, это можно проголосовать за удаление или что-то еще.

4b9b3361

Ответ 1

Без особого метода это трудно понять наверняка, но он уверен, выглядит следующим образом:

ReSharper определил, что единственный способ, которым boolVal может быть истинным, - это если хотя бы один из LoggedInMembershipUser или obj равен нулю. Первый if никогда не достигает части boolVal, если оба значения не равны нулю. Таким образом, в точке, где boolVal оценивается, она должна быть ложной.

Если вы переупорядочиваете условия, то эта логика больше не выполняется. ReSharper может потенциально проанализировать это выражение, определить, что все части являются быстрыми и свободными от побочных эффектов, и обратите внимание, что boolVal не требуется во втором случае, но этот анализ несколько сложнее и, по-видимому, не был записан.

Ответ 2

Каждый раз, когда я исследовал неожиданный сценарий Expression is always true|false с ReSharper, инструмент оказался более умным, чем я. Например, ReSharper знает деревья наследования; в этом кодовом блоке:

void doSomething(Object obj)
{
    if(obj is StreamReader || obj is TextReader)
        foo();
}

... Resharper отметит (obj is TextReader) как Expression is always false, потому что ветвь (obj is StreamReader) кода уже захватила любые объекты TextReader и перешла на foo(), закоротив любую дальнейшую оценку.