2009-07-07 16 views
124

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

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

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

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

ответ

250

Вы хотите использовать null-coalescing operator, который предназначен именно для этой цели.

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

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

вот фрагмент, который я использовал в презентаторе, заполняя представление с помощью Nullable Date/Time: 'memDateLogin = m.memDateLogin ?? DateTime.MinValue' –

+0

'DateTime?'доза не содержит определения для' UpdateDate ' –

15

Вам нужно вызвать Value свойство nullable 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; 
+0

+1 для значения - и для нулевых связывающего. –

0

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

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

Как о следующем:

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

Попробуйте

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

Ключевым здесь является оператор с нулевым коалесцированием, см. Ответ chills42. – cspolton

72

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

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

Путь читабельнее других. – Newbie

+0

Это сделало мой код намного более удобочитаемым. – Luke101

4

Вот отрывок я в Presenter наполняя вид с Nullable Дата/время

memDateLogin = m.memDateLogin ?? DateTime.MinValue 
3

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

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

, а пользователь следующие его гораздо лучше

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

Вы можете использовать простой бросок:

DateTime dtValue = (DateTime) dtNullAbleSource; 
+3

Отлично, если вы проверяете, является ли значение var равным нулю до +1 –

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

Это нормально считается хорошей формой, чтобы объяснить ваши предложения/ответы. Кодовые ответы могут быть на удивление неинформативными, даже если они технически правильны. –

+0

@MaximilianAst да, вы правы, попытаетесь реализовать то, что вы предложили :) –

Смежные вопросы