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

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

пример:

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

Я знаю, что могу использовать DateTime? В C# 2.0, чтобы разрешить присвоение null dateTimeTest и что я мог бы использовать Джон тарелкам на моей строке, чтобы получить ошибку времени выполнения при назначении stringTest. Мне просто интересно, почему эти два типа ведут себя иначе.

6 ответов


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


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

HTH!


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

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

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

поэтому, когда у вас есть ссылка, она может содержать либо адрес допустимого объекта, либо он может быть нулевым. Когда объекты типа value равны all-zero, они просто равны нулю. Например. целое число ноль, float ноль, логическое значение false или DateTime.Параметр minvalue. Если вам нужно различать "ноль" и "значение отсутствует/null", вам нужно использовать либо отдельный логический флаг, либо, еще лучше, использовать класс Nullable в .NET 2.0. Это просто значение плюс логический флаг. Есть также поддержка в CLR так, что бокс Nullable с HasValue=false приводит к нулевой ссылке, а не в коробчатой структуре с false+zero, как это было бы, если бы вы должны были реализовать эту структуру самостоятельно.


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

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


чтобы тип значения был null, должно быть какое-то значение, которое он может содержать, которое не имело бы другого законного значения, и который система каким-то образом будет знать, следует рассматривать как "null". Некоторые типы значений могут соответствовать первому критерию без необходимости дополнительного хранения. Если бы .net был разработан с нуля с учетом концепции нулевых значений, он мог бы иметь Object include a virtualIsLogicalNullproperty, and a non-virtualфункции isnullwhich would return trueifэтойis null and, otherwise invoke itsIsLogicalNullproperty and return the result. If .net had done this, it would have avoided the need for the quirky boxing behavior andstructconstraint ofтип nullable(an emptyтип nullablecould be boxed as an emptyтип nullable, and still be recognized asnull`).

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


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