System.DateTime? против System.DateTime - PullRequest
       22

System.DateTime? против System.DateTime

26 голосов
/ 13 ноября 2009

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

Код ниже:

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) описывает тип данных как System.DateTime? ... ясно "?" как-то связано со всем этим.

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

Спасибо

Ответы [ 6 ]

46 голосов
/ 13 ноября 2009

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

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

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

DateTime? dateOrNull = myCalendarExtender.SelectedDate;
if (dateOrNull != null)
{
    DateTime newSelectedDate = dateOrNull.Value;
}
21 голосов
/ 13 ноября 2009

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

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

DateTime? someNullableDate;
DateTime myDate;

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

Другой, более краткий способ получить значение Nullable, это использование оператора слияния нуль:

DateTime myDate = someNullableDate?? default(DateTime);
10 голосов
/ 13 ноября 2009

Гораздо лучшее решение и IMO - лучшая особенность класса nullable

DateTime newSelectedDate = myCalendarExtender.SelectedDate.GetValueOrDefault();
9 голосов
/ 13 ноября 2009

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

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

РЕДАКТИРОВАТЬ: еще более кратким, благодаря комментарию Джоша:

var newSelectedDate = myCalendarExtender.SelectedDate ?? SomeDefaultValue;

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

2 голосов
/ 13 ноября 2009

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

0 голосов
/ 30 августа 2017
var Endtime = DateTime.Now();
DateTime startTime = item.REPORT_TIME.HasValue ? item.REPORT_TIME.Value : Endtime;

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

`var Endtime = DateTime.Now; var startTime = item.REPORT_TIME.HasValue? Convert.ToDateTime (item.REPORT_TIME.HasValue): конечное время

`

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...