Как это, если условие недостижимо?

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 в качестве?? часть всегда будет оценивать как истину

Другие вопросы по тегам