Другие ответы (не включая ответ Чопикадзе), похоже, основаны на неправильном прочтении фактов.Ни один из примеров не генерирует исключение.
Скорее, в первом примере созданное исключение ex
предоставляет сообщение, поскольку значение параметра сообщения конструктора было нулевым.Сообщение является «исключением типа« System.Exception »было сгенерировано».
Это довольно распространенная практика - иметь некоторый запасной вариант поведения, когда ссылка на объект является нулевой, так что это «как это можно объяснить».«Ожидаемое», конечно, зависит от ваших ожиданий.
Бросать исключения в ходе обработки исключений может быть проблематично, поэтому разработчики фреймворка должны были выбрать это поведение, чтобы уменьшить эту возможность.Честно говоря, было бы кошмаром, если бы нам всем приходилось скрывать, что сообщения об исключениях могут быть нулевыми.
РЕДАКТИРОВАТЬ
Поведение также задокументировано в примечания к свойству Message : «Если в конструктор для текущего экземпляра не было отправлено сообщение, система предоставит сообщение по умолчанию, отформатированное с использованием текущей системной культуры.»
Я посмотрелв спецификации CLI и в спецификации C #, и я не нашел упоминания о требовании, чтобы Message имел ненулевое возвращаемое значение, поэтому я предполагаю, что это поддерживает представление о том, что это поведение является решением при разработке структуры.