2014-01-08 3 views
1

IsSaveNew является типом bool? CoverLetterId является типом int?Как это, если условие недостижимо?

if (coverLetter.IsSaveNew ?? true || coverLetter.CoverLetterId == null) 

coverLetter.CoverLetterId == null. Это заявление отмечено как недоступное в visual studio (2012).

Но если IsSaveNew был фальшивым, тогда он достиг бы второго условия. Почему Visual Studio так говорит?

ответ

6

Выглядит как проблема приоритета оператора. Ваше утверждение оценивается как:

if (coverLetter.IsSaveNew ?? (true || coverLetter.CoverLetterId == null)) 

Таким образом, правый операнд для оператора || никогда не будет оценена, поскольку его левый операнд является буквальным true.

Вы можете добавить круглые скобки, чтобы решить эту проблему:

if ((coverLetter.IsSaveNew ?? true) || coverLetter.CoverLetterId == null) 
+0

Но еще визуально студии говорит его недостижимость –

+0

@SubinJacob, у вас есть фактическое предупреждение в панели вывода в процессе сборки, или это только Intellisense маркировки выражение как недостижимая? –

+0

Извините, в этом была проблема с intellisense. Когда я скомпилировал, он был исправлен. Спасибо –

0

Вы бы лучше использовать GetValueOrDefault как ?? часть будет всегда оцениваться в соответствии с истинными значениями

3

|| имеет приоритет выше, чем ?? Оператор.

Заканчивать 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)

Если первый операнд имеет значение истинно, то второй операнд не оценивается. Если первый операнд оценивает значение false, второй оператор определяет, будет ли выражение OR в целом оцениваться как истинным или ложным.

+0

Даже после добавления() предупреждение остается.Тем не менее, код выполняется отлично, когда ложь передается –

+0

@SubinJacob Я думаю, вы используете какой-то плагин в Visual Studio. Это означает, что ваш 'coverLetter.IsSaveNew ?? true' возвращает 'true'. Это может означать две вещи: либо ваш 'coverLetter.IsSaveNewis' является' null' ** ИЛИ ** ваш 'coverLetter.IsSaveNewis' является' true'. –

1

Вы можете положить coverLetter.IsSaveNew ?? true в скобках, чтобы решить эту проблему. как-

if ((coverLetter.IsSaveNew ?? true) || coverLetter.CoverLetterId == null)