Подтвердить что ты не робот

Почему null не разрешен для DateTime в С#?

Почему не разрешено присваивать значение null DateTime в С#? Как это было реализовано? И можно ли использовать эту функцию, чтобы сделать ваши собственные классы не-nullable?

Пример:

string stringTest = null; // Okay
DateTime dateTimeTest = null; // Compile error

Я знаю, что я могу использовать DateTime? в С# 2.0, чтобы позволить null присваиваться dateTimeTest и что я мог бы использовать Jon Skeet NonNullable class в моей строке, чтобы получить ошибку времени выполнения для назначения stringTest. Мне просто интересно, почему два типа ведут себя по-другому.

4b9b3361

Ответ 1

DateTime - это тип значения (struct), где-как строка является ссылочным типом (class и т.д.). Это ключевое различие. Ссылка всегда может быть нулевой; значение не может (если оно не использует Nullable<T> - ie DateTime?), хотя оно может быть zero'd (DateTime.MinValue), которое часто интерпретируется как то же, что и null (особенно в версии 1.1).

Ответ 2

DateTime - это структура, а не класс. Сделайте "перейти к определению" или просмотрите его в обозревателе объектов, чтобы увидеть.

НТН!

Ответ 3

Важное различие между ValueTypes и ссылочными типами состоит в том, что типы значений имеют эту "семантику значений". DateTime, Int32 и все другие типы значений не имеют идентификатора, Int32 "42" по существу неотличим от любого другого Int32 с тем же значением.

Все значения типа "объекты" существуют либо в стеке, либо как часть объекта ссылочного типа. Одним из особых случаев является то, что экземпляр типа значения присваивается объекту или интерфейсу - это называется "бокс", и он просто создает объект фиктивного ссылочного типа, который содержит только значение, которое можно извлечь обратно ( "unboxed" ).

Ссылочные типы, с другой стороны, имеют идентичность. "новый объект()" не равен никакому другому "новому объекту()", поскольку они представляют собой отдельные экземпляры в куче GC. Некоторые ссылочные типы предоставляют метод Equals и перегруженные операторы, так что они ведут себя более ценно, например, например. Строка "abc" равна другой строке "abc", даже если они фактически представляют собой два разных объекта.

Поэтому, когда у вас есть ссылка, она может содержать адрес действительного объекта или может быть нулевой. Когда объекты типа значения все-ноль, они просто равны нулю. Например. целое число 0, ноль с плавающей точкой, логическое значение false или DateTime.MinValue. Если вам нужно различать "ноль" и "значение missing/null", вам нужно использовать либо отдельный логический флаг, либо, еще лучше, использовать класс Nullable <T> в .NET 2.0. Это просто значение плюс флаг Boolean. Там также поддерживается в CLR, чтобы бокс Nullable с HasValue = false приводил к нулевой ссылке, а не в коробке с ложным + нолем, как если бы вы сами реализовали эту структуру.

Ответ 4

DateTime - тип значения, такой же, как int. Только ссылочные типы (например, string или MyCustomObject) могут быть пустыми. Типы ссылок действительно хранят "ссылки" на местоположение объектов в куче.

здесь статья Я нашел, что объясняет это лучше. и здесь статья MSDN на нем

Ответ 5

Для типа значения, который должен быть нулевым, должно быть какое-то значение, которое оно может содержать, которое не имеет другого легитимного значения, а , которое система каким-то образом знает, следует рассматривать как "null" . Некоторые типы значений могут соответствовать первому критерию, не требуя дополнительного хранения. Если .net был спроектирован с нуля с учетом концепции нулевых значений, он мог бы иметь Object include a virtual IsLogicalNull property, and a non-virtual IsNull which would return true if this is null and, otherwise invoke its IsLogicalNull property and return the result. If .net had done this, it would have avoided the need for the quirky boxing behavior and struct constraint of Nullable (an empty Nullable could be boxed as an empty Nullable , and still be recognized as null`).

К тому моменту, когда было решено предоставить поддержку для типов значений с нулевым значением в .net 2.0, однако было написано много кода, в котором предполагается, что значения по умолчанию для таких вещей, как Guid и DateTime, не будут рассматриваться как null. Поскольку значительная часть значений в типах с нулевым значением лежит с их предсказуемым значением по умолчанию (т.е. null), имеющим типы, которые имели значение null, но по умолчанию что-то еще, добавили бы больше путаницы, чем значение.

Ответ 6

string - это класс, тогда как DateTime - это структура. Вот почему вы не можете установить значение null