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

System.DateTime? vs System.DateTime

Я писал код, где мне нужно было прочитать значение даты из элемента управления Calendar на моей странице (Ajax toolkit: calendar extender).

Код ниже:

DateTime newSelectedDate = myCalendarExtender.SelectedDate;

дает следующую ошибку:

Cannot implicitly convert type 'System.DateTime?' to 'System.DateTime'. An explicit conversion exists (are you missing a cast?)

Однако, вставив приведение, я могу заставить код работать:

DateTime newSelectedDate = (DateTime)myCalendarExtender.SelectedDate; // works fine!

Свойство "SelectedDate" для элемента управления календарем (Ajax toolkit) описывает тип данных как "System.DateTime?".... ясно, что? имеет какое-то отношение ко всему этому.

Что именно происходит, когда тип данных содержит этот символ (?)... Я предположил, что я могу применить свойство SelectedDate прямо к переменной типа DateTime без кастования.

Спасибо

4b9b3361

Ответ 1

? означает, что тип является нулевым. Подробнее см., Например, MSDN

Nullable - это поддерживаемая компилятором оболочка вокруг типов значений, которая позволяет типам значений становиться нулевыми.

Чтобы получить доступ к значению DateTime, вам необходимо сделать следующее:

DateTime? dateOrNull = myCalendarExtender.SelectedDate;
if (dateOrNull != null)
{
    DateTime newSelectedDate = dateOrNull.Value;
}

Ответ 2

DateTime? совпадает с Nullable<DateTime> То есть: экземпляр DateTime? может содержать "NULL", а экземпляр DateTime - нет. (Это справедливо для всех типов значений с .NET 2.0. Тип значения не может содержать NULL, но, как и .NET 2.0, типы значений с нулевым значением поддерживаются конструкцией Nullable<T> (или сокращением).

Вы можете получить значение DateTime? и поместите его в DateTime, выполнив следующее:

DateTime? someNullableDate;
DateTime myDate;

if( someNullableDate.HasValue )
   myDate = someNullableDate.Value;

Ответ 3

Элемент управления календарем возвращает значение Nullable <DateTime> (стенография в С# - DateTime?) в свойстве SelectedDate, поскольку DateTime является структурой. Нулевое значение позволяет элементу управления иметь состояние "нет даты". Таким образом, вам нужно будет проверить, имеет ли значение nullable значение, прежде чем вы сможете его использовать.

var nullable = myCalendarExtender.SelectedDate;
var newSelectedDate = (nullable.HasValue) ? nullable.Value : SomeDefaultValue;

EDIT: Еще более кратким, благодаря комментарию Джоша:

var newSelectedDate = myCalendarExtender.SelectedDate ?? SomeDefaultValue;

Мне это нравится!

Ответ 4

Более эффективное решение и IMO - лучшая функция для всех с классом с нулевым значением

DateTime newSelectedDate = myCalendarExtender.SelectedDate.GetValueOrDefault();

Ответ 5

Вы можете использовать оператора для работы с нулевыми значениями в краткой форме на С#. См. Мой комментарий к ответу Трэвиса для более короткого способа выражения понятия "если не нуль, а затем использовать его еще использовать понятие по умолчанию". Они оба делают то же самое.

Ответ 6

var Endtime = DateTime.Now();
DateTime startTime = item.REPORT_TIME.HasValue ? item.REPORT_TIME.Value : Endtime;

Значения: тип item.item.REPORT_TIME - system.DateTime?
     howerver тип startTime - system.DateTime;   поэтому код может изменить его как

`var Endtime = DateTime.Now; var startTime = item.REPORT_TIME.HasValue? Convert.ToDateTime(item.REPORT_TIME.HasValue): Endtime

`