Попытка понять, почему 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();
}
Хорошо спасибо за комментарии к комментариям. Я думаю, это можно проголосовать за удаление или что-то еще.
Ответы
Ответ 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()
, закоротив любую дальнейшую оценку.