Як конвертувати DateTime? до DateTime


171

Я хочу перетворити зведений DateTime ( DateTime?) в a DateTime, але я отримую помилку:

Не вдається неявно перетворити тип "System.DateTime?" до 'System.DateTime'. Існує явна конверсія (пропускаєш амплуа?)

Я спробував таке:

DateTime UpdatedTime = (DateTime)_objHotelPackageOrder.UpdatedDate == null 
    ? DateTime.Now : _objHotelPackageOrder.UpdatedDate;

Відповіді:


304

Ви хочете скористатися оператором зв'язання з нулем , який призначений саме для цієї мети.

Використовуючи його, ви закінчуєте цей код.

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now;

1
ось фрагмент, який я використав у презентаторі, який заповнює подання з недійсним датою / часом: memDateLogin = m.memDateLogin ?? DateTime.MinValue
Раві Рам,

'Дата, час?' доза не містить визначення для 'UpdatedDate'
Василь Валчев

88

MS вже створив метод для цього, тому вам не доведеться використовувати оператор з’єднання нуля. Немає різниці у функціональності, але не експертам простіше зрозуміти те, що відбувається, з першого погляду.

DateTime updatedTime = _objHotelPackageOrder.UpdatedDate.GetValueOrDefault(DateTime.Now);

43

Спробуйте це

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now;

Ключовим тут є оператор злиття нуля, більше інформації див. У відповіді chills42.
cspolton

24

Ви можете використовувати просту ролю:

DateTime dtValue = (DateTime) dtNullAbleSource;

Як сказав Леандро Тупоне, ви повинні перевірити, чи не було раніше значення var


6
Ідеально, якщо ви перевірите, чи змінено значення var до +1
Леандро

22

Потрібно викликати властивість Value зведеного DateTime. Це поверне DateTime.

Якщо припустити, що UpdatedDateце DateTime?, то це має працювати:

DateTime UpdatedTime = (DateTime)_objHotelPackageOrder.UpdatedDate == null ? DateTime.Now : _objHotelPackageOrder.UpdatedDate.Value;

Щоб полегшити читання коду, ви можете використовувати властивість HasValue замість nullчека:

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate.HasValue
                          ? _objHotelPackageOrder.UpdatedDate.Value
                          : DateTime.Now;

Потім це можна зробити ще більш стислим:

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now;

6

Як щодо наступного:

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate.HasValue ? _objHotelPackageOrder.UpdatedDate.value : DateTime.Now;

6

Ось фрагмент, який я використав у презентаторі, який заповнює подання з недійсною датою / часом

memDateLogin = m.memDateLogin ?? DateTime.MinValue


1

Подумайте про використання наступного, що набагато краще, ніж прийнята відповідь

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate == null 
    ? DateTime.Now : (DateTime)_objHotelPackageOrder.UpdatedDate;

Хочете сказати, чому це краще?
n4rzul


0
DateTime UpdatedTime = _objHotelPackageOrder.HasValue ? _objHotelPackageOrder.UpdatedDate.Value : DateTime.Now;

4
Це нормально вважається гарною формою для пояснення ваших пропозицій / відповідей. Відповіді лише на код можуть бути напрочуд неінформативними, навіть якщо вони технічно правильні.
Максиміліан Аст

1
@MaximilianAst так, ти маєш рацію, спробуєш реалізувати так, як ти запропонував :)
Жорсткий В'яс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.