2014-01-08 3 views
1

IsSaveNewbool? CoverLetterId 유형 것은 int?조건에 도달 할 수없는 경우 어떻게해야합니까?

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

의 유형이다. 이 문장은 Visual Studio (2012)에서 도달 할 수없는 것으로 표시됩니다.

그러나 IsSaveNew이 거짓이면 두 번째 조건에 도달합니다. Visual Studio가 그렇게 말하는 이유는 무엇입니까?

답변

6

운영자 우선 순위 문제처럼 보입니다. 그 왼쪽 피연산자는 문자 그대로 true 때문에

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

는 그래서 || 연산자 오른쪽 피연산자는 평가되지 않습니다 : 명령은 다음과 같이 평가한다.

이 문제를 해결하기 위해 괄호를 추가 할 수 있습니다

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

하지만 여전히 비주얼 스튜디오 같은 - 당신이 빌드하는 동안 출력 창에서 실제 경고를해야합니까, 그 도달 할 수없는 –

+0

@SubinJacob를 말한다, 또는는 도달 할 수없는 표현을 표시에만 인텔리입니까? –

+0

죄송합니다. 인텔리 센스의 문제였습니다. 컴파일했을 때, 문제가 해결되었습니다. 고맙습니다. –

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식이 전체적으로 true 또는 false로 평가되는지 여부를 결정합니다.

+0

added() 후에도 경고가 유지됩니다.그러나 false가 전달되면 코드가 완벽하게 실행됩니다. –

+0

@SubinJacob Visual Studio에서 일부 플러그인을 사용하고 있다고 생각합니다. 그건 당신의'coverLetter.IsSaveNew ?? true'는'true'를 반환합니다. 그건 당신의 'coverLetter.IsSaveNewis'가'null'이거나 ** coverLetter.IsSaveNewis'가'true'입니다. –

1

coverLetter.IsSaveNew? 이 문제를 해결하려면 paranthesis에서을 true로 설정하십시오.

if ((coverLetter.IsSaveNew ?? true) || coverLetter.CoverLetterId == null) 
관련 문제