2011-11-29 65 views
9

當InnerException爲空時,這將引發空引用異常。爲什麼會拋出空引用異常?

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

這是因爲您的第一條陳述是評估" inner exception: " + e.InnerException == nulltruefalse。這全是關於運算符優先級,這就是爲什麼第二個工作得很好,因爲括號(())。

See this reference for Operator Precedence。在等於==運算符之前對+運算符進行求值。

+0

這就是爲什麼最好在非明顯情況下包含括號,所以您不必考慮運算符優先級。 – Malcolm

+0

@Malcolm我完全同意。 – 2011-11-30 00:36:22

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 ?它不是。

相關問題