Как это, если условие недостижимо?
IsSaveNew
это тип bool?
CoverLetterId
это тип int?
if (coverLetter.IsSaveNew ?? true || coverLetter.CoverLetterId == null)
coverLetter.CoverLetterId == null
, Это утверждение помечено как недоступное в visual studio(2012).
Но если IsSaveNew
был ложным, то он достиг бы при втором условии. Почему Visual Studio так говорит?
4 ответа
Похоже, проблема приоритета оператора. Ваше утверждение оценивается как:
if (coverLetter.IsSaveNew ?? (true || coverLetter.CoverLetterId == null))
Таким образом, правый операнд ||
Оператор никогда не будет оцениваться, так как его левый операнд является литералом true
,
Вы можете добавить скобки, чтобы решить эту проблему:
if ((coverLetter.IsSaveNew ?? true) || coverLetter.CoverLetterId == null)
||
имеет более высокий приоритет, чем ??
оператор.
Проверять, выписываться 7.2.1 Operator precedence and associativity
Ваш true || coverLetter.CoverLetterId == null
работает первым. Если ты хочешь coverLetter.IsSaveNew ?? true
должен работать в первую очередь, просто используйте круглые скобки вокруг него.
Подобно;
if ((coverLetter.IsSaveNew ?? true) || coverLetter.CoverLetterId == null)
Но все же визуальная студия говорит, что она недоступна
Это означает (вероятно) ваш coverLetter.IsSaveNew ?? true
возвращается true
Вот почему ваш второй операнд не оценивает.
От || Operator (C# Reference)
Если первый операнд оценивается как true, второй операнд не оценивается. Если первый операнд оценивается как false, второй оператор определяет, будет ли выражение OR в целом иметь значение true или false.
Вы можете поставить coverLetter.IsSaveNew?? правда в парантезе, чтобы решить это. лайк-
if ((coverLetter.IsSaveNew ?? true) || coverLetter.CoverLetterId == null)
Вам лучше использовать GetValueOrDefault в качестве?? часть всегда будет оценивать как истину