Як конвертувати 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.