Почему типы значений не могут быть нулевыми - PullRequest
18 голосов
/ 29 июня 2011

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

Ответы [ 2 ]

36 голосов
/ 29 июня 2011

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

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

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

1 голос
/ 29 июня 2011

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

...