Почему это вызывает исключение нулевой ссылки? - PullRequest
9 голосов
/ 29 ноября 2011

Это вызовет исключение нулевой ссылки, когда 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. Почему они не эквивалентны?

Ответы [ 4 ]

22 голосов
/ 29 ноября 2011

Это потому, что ваше первое утверждение оценивает " inner exception: " + e.InnerException == null как true или false. Это все о приоритет оператора , поэтому второй работает просто отлично из-за скобок (( и )).

См. Эту ссылку для приоритета оператора . Оператор + вычисляется перед оператором равенства ==.

4 голосов
/ 29 ноября 2011

Это связано с приоритетом оператора, в этом случае оператор + имеет более высокий приоритет, чем оператор ==, поэтому вам необходимо использовать скобки, чтобы переопределить порядок приоритетов по умолчанию, чтобы код выполнялся в правильном порядке.

Вы можете прочитать все об этом в спецификации языка C #:

Приоритет оператора и ассоциативность

Когда выражение содержит несколько операторов,приоритет операторов управляет порядком, в котором оцениваются отдельные операторы.

3 голосов
/ 29 ноября 2011

Это:

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

Возможно, оценивается так:

String s = (" inner exception: " + e.InnerException) == null ? "None" : e.InnerException.Message;
2 голосов
/ 29 ноября 2011

Порядок операций:

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

Оценивается как (" inner exception: " + e.InnerException) == null ?, что не является.

...