2011-11-29 17 views
9

Spowoduje to zgłoszenie wyjątku o wartości zerowej, gdy wyjątek InnerException ma wartość null.Dlaczego powoduje to wyjątek odwołania o wartości zerowej?

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

ale to nie będzie:

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

obu powyższych build grzywny. Nie wiem, co stara się zrobić, to sprawi, że oceni on e.InnerException.Message. Dlaczego nie są one równoważne?

Odpowiedz

22

Dzieje się tak, ponieważ twoje pierwsze stwierdzenie oceniajako true lub false. Chodzi o to, że operator ma pierwszeństwo przed operacją, dlatego drugi działa dobrze z powodu nawiasu (( i )).

See this reference for Operator Precedence. Operator + jest oceniany przed operatorem równości ==.

+0

Dlatego najlepiej jest dołączyć nawiasy w nieoczywistych przypadkach, aby nie trzeba było myśleć o priorytecie operatora. – Malcolm

+0

@Malcolm Całkowicie się zgadzam. –

4

Jest to spowodowane pierwszeństwem operatora, w tym przypadku operator + ma wyższy priorytet niż operator ==, dlatego należy użyć nawiasów, aby zastąpić domyślny porządek pierwszeństwa, aby kod został wykonany w prawidłowej kolejności.

Można przeczytać o tym w opisie # języka C:

Operator precedence and associativity

Gdy wyrażenie zawiera wiele operatorów, pierwszeństwo z operatorów kontroluje kolejność, w jakiej poszczególne podmioty gospodarcze są oceniane .

3

to:

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

prawdopodobnie jest oceniany tak:

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

Kolejność operacji:

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

jest oceniany jako (" inner exception: " + e.InnerException) == null ? który nie jest.

Powiązane problemy