Конструктор в .Net гарантированно возвращает ненулевой экземпляр типа объекта. Независимо от того, является ли экземпляр допустимым , зависит от индивидуальной семантики типа.
Исключения, сгенерированные в конструкторе, не будут произвольно поглощены CLR (хотя пользовательский код может их проглотить). CLR будет распространять исключение точно так же, как исключения, генерируемые любым другим методом, и объекты в конечном итоге будут должным образом собираться мусором.
Что касается других упомянутых вами случаев
- Создание структур: структуры по определению не могут быть нулевыми. Исключения, сгенерированные в конструкторе, будут нормально распространяться
- Получение члена перечисления: перечисления являются типами strutures / value и не могут быть нулевыми
- результат Object.ToString (): это может (и, к сожалению, будет) быть нулевым. String является ссылочным типом, и вполне допустимо возвращать null из переопределения ToString (пожалуйста, не делайте этого).
- Математические операции: это сильно зависит как от настройки переполнения вашего проекта, так и от конкретного используемого типа (целочисленная или с плавающей запятой).
Математический вопрос почти заслуживает ответа сам по себе. С одной стороны, результат математической операции над примитивными типами никогда не будет нулевым. Но это все еще может быть недействительным. Например, следующий код не будет выдан, но будет ли результат действительным, сильно зависит от вашего конкретного сценария
float f1 = 1.0;
float f2 = f1 / 0;
В этот момент f2 является очень специфическим значением с плавающей точкой, которое не представляет действительное число. Это действительно? Зависит от вашего варианта использования.