2011-11-29 3 views
9

InnerException이 null의 경우, null 참조 예외가 슬로우됩니다.왜 null 참조 예외가 발생합니까?

String s = " inner exception: " + e.InnerException == null ? "None" : e.InnerException.Message; 

하지만이되지 않습니다

String s = " inner exception: " + (e.InnerException == null ? "None" : e.InnerException.Message); 

위의 빌드 좋은 모두를. 나는 그것이 이전에하려고했던 것이 무엇인지 알아낼 수 없다. 그 결과는 e.InnerException.Message이 될 것이다. 왜 그들은 동등하지 않습니까?

답변

22

첫 번째 진술은 을 true 또는 false으로 평가하기 때문입니다. 이게 전부 에 대한 연산자 우선 순위입니다. 그 이유는 두 번째가 괄호 (())로 인해 정상적으로 작동하는 이유입니다.

See this reference for Operator Precedence. + 연산자는 동등 연산자 ==보다 먼저 계산됩니다.

+0

그래서 연산자 우선 순위에 대해 생각할 필요가 없으므로 뻔뻔하지 않은 경우에는 대괄호를 포함하는 것이 가장 좋습니다. – Malcolm

+0

@Malcolm 전적으로 동의합니다. –

4

연산자 우선 순위로 인해이 경우 + 연산자가 == 연산자보다 우선 순위가 높으므로 괄호를 사용하여 코드가 올바른 순서로 실행되도록 기본 우선 순위를 재정의해야합니다.

당신은 C# 언어 사양에 대한 모든 것을 읽을 수 있습니다 :

Operator precedence and associativity

표현 여러 연산자를 포함는 사업자의 우선 순위는 개인 사업자가 평가되는 순서를 제어 .

3

이 :

String s = " inner exception: " + e.InnerException == null ? "None" : e.InnerException.Message; 

아마 이런 식으로 평가되고 : 작업의

String s = (" inner exception: " + e.InnerException) == null ? "None" : e.InnerException.Message; 
2

주문은 :

String s = " inner exception: " + e.InnerException == null ? "None" : e.InnerException.Message; 

은 그렇지 않은하는 (" inner exception: " + e.InnerException) == null ?로 평가된다.