Почему значения типов не могут быть нулевыми

Я знаю, что можно использовать типы значений Nullable, которые обертывают тип значения и дают возможность хранить нуль. Но есть ли техническая причина, чтобы тип значения не был нулевым, или причина только концептуальна?

Ответы

Ответ 1

Тип ссылки хранится как ссылка (например, указатель) на экземпляр объекта.
null означает ссылку, которая не указывает на экземпляр объекта.

Типы значений сохраняются как сами значения, без каких-либо ссылок.
Поэтому нет смысла иметь тип значения null — тип значения по определению содержит значение.

Nullable<T> - это тип значения с флагом HasValue, который может быть false, чтобы указать, что нет значения. Он по-прежнему имеет значение (когда HasValue - false, Value - default(T)), но флаг HasValue указывает на игнорирование значения.
Он не имеет ничего общего с null, за исключением того, что среда CLR автоматически удаляет значения null в коробке с Nullable<T> с HasValue, установленными на false.

Ответ 2

Тип значения, например "Int32", сохраняется с использованием тридцати двух бит хранилища. Есть точно 4 294 967 296 значений, которые могут быть представлены 32 битами, а Int32 может содержать 4 294 967 296 различных значений. Если -2,147,483,648 не являются допустимым значением Int32, возможно, это будет возможно использовать для представления "null", но тот факт, что его двоичное представление не является нулевым, может усложнить ситуацию. Напротив, количество возможных битовых комбинаций в ссылочном типе намного превышает количество возможных допустимых ссылок, поэтому нет сложностей в резервировании битовой комбинации для представления "null".