C # - это язык высокого уровня, который компилируется в IL .
С введением обнуляемых типов стандарт C # изменился, поэтому пришлось изменить поведение компилятора C # для обработки нового правила, такого как "no struct, , за исключением Nullable , может быть присвоено значение null ".
Присвоение null для структуры, как правило, запрещено, но это просто правило, которое компилятор применяет при генерации IL . Поскольку компилятор анализирует весь ваш код и выясняет, что он означает, он может распознавать все виды правил, даже те, которые для вас могут показаться исключениями.
По сути, если компилятор анализирует ваш код C # и обнаруживает, что вы присваиваете null для структуры, он выводит ошибку. Если он обнаружит, что вы присваиваете null структуре Nullable<T>
, он знает, как с этим справиться, и сгенерирует соответствующий IL.
Из стандарта C #:
13.7.1 Преобразования нулевого типа : "Существует неявное преобразование из нулевого типа (§11.2.7) в любой тип, допускающий значение NULL. Это преобразование создает нулевое значение (§12.2) данного Nullable типа. "
12.2 Значения по умолчанию : "Значением по умолчанию для типа, допускающего значение nullable, является экземпляр, для которого свойство HasValue имеет значение false. Ссылка на свойство Value для значения по умолчанию для значения типа nullable приводит к исключению типа System.InvalidOperationException. Значение по умолчанию также известно как нулевое значение типа Nullable. Неявное преобразование существует из нулевого типа (§11.2.7) в любой тип NULL, и это преобразование создает нулевое значение типа. "