Как конвертировать DateTime? в DateTime

171

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

Не удается неявно преобразовать тип 'System.DateTime?' в «System.DateTime». Существует явное преобразование (вам не хватает приведения?)

Я попытался следующее:

DateTime UpdatedTime = (DateTime)_objHotelPackageOrder.UpdatedDate == null 
    ? DateTime.Now : _objHotelPackageOrder.UpdatedDate;
Вахид
источник

Ответы:

304

Вы хотите использовать оператор объединения нулей , который предназначен именно для этой цели.

Используя его, вы получите этот код.

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now;
chills42
источник
1
Вот фрагмент кода, который я использовал в Докладчике, заполняющий представление с помощью Обнуляемой даты / времени: memDateLogin = m.memDateLogin ?? DateTime.MinValue
Рави Рам
"DateTime? доза не содержит определения для «Обновленной даты»
Василь
88

MS уже сделала метод для этого, так что вам не нужно использовать оператор объединения нулей. Нет различий в функциональности, но неспециалистам легче понять происходящее с первого взгляда.

DateTime updatedTime = _objHotelPackageOrder.UpdatedDate.GetValueOrDefault(DateTime.Now);
мистифицировать
источник
43

Попробуй это

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now;
Валентин Васильев
источник
Ключевым моментом здесь является оператор слияния нуля, более подробную информацию смотрите в ответе chills42.
Cspolton
24

Вы можете использовать простое приведение:

DateTime dtValue = (DateTime) dtNullAbleSource;

Как сказал Леандро Тупоне, вы должны проверить, является ли переменная нулевой, прежде чем

Сезар Леон
источник
6
Идеально, если вы проверяете, является ли
Леандро
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;
adrianbanks
источник
6

Как насчет следующего:

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate.HasValue ? _objHotelPackageOrder.UpdatedDate.value : DateTime.Now;
Саймон Уилсон
источник
6

Вот фрагмент, который я использовал в Presenter, заполняя представление со значением Nullable Date / Time

memDateLogin = m.memDateLogin ?? DateTime.MinValue
Рави Рам
источник
3

Вы также можете попробовать Nullable (T) Свойства :

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate.HasValue 
    ? DateTime.Now : _objHotelPackageOrder.UpdatedDate.Value;
Матеуш Рогульский
источник
1

Рассмотрите возможность использования следующего, который намного лучше, чем принятый ответ

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate == null 
    ? DateTime.Now : (DateTime)_objHotelPackageOrder.UpdatedDate;
Садикаббас Хирани
источник
Не хочешь сказать, почему это лучше?
n4rzul
0

Попробуй это:

DateTime UpdatedTime = (DateTime)_objHotelPackageOrder.UpdatedDate == null ? DateTime.Now : _objHotelPackageOrder.UpdatedDate.Value;
Тим С. Ван Харен
источник
0
DateTime UpdatedTime = _objHotelPackageOrder.HasValue ? _objHotelPackageOrder.UpdatedDate.Value : DateTime.Now;
Суровые Вьяс
источник
4
Обычно считается хорошей формой для объяснения ваших предложений / ответов. Код только ответы могут быть удивительно неинформативными, даже если они являются технически правильными.
Максимилиан Аст
1
@MaximilianAst Да, вы правы, постараетесь реализовать то, что вы предложили :)
Harsh Vyas