2009-07-07 169 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

这里是我用Presenter填充可视化日期/时间视图的代码片断:`memDateLogin = m.memDateLogin ?? DateTime.MinValue` – 2012-07-12 04:59:54

+0

'DateTime?'剂量不包含'UpdatedDate'的定义 – 2017-05-02 17:27:20

15

您需要调用Value可为空的DateTime的属性。这将返回一个DateTime。

假设UpdatedDateDateTime?,那么这应该工作:

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的价值 - 和空合并。 – 2009-07-07 12:21:59

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 2010-11-24 07:39:55

72

MS已经为此做了一个方法,所以你不必使用null合并运算符。在功能上没有区别,但非专家更容易一眼就看到发生的事情。

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

比其他选项更可读的方式。 – Newbie 2010-03-08 22:42:27

+0

这使我的代码更加可读。 – Luke101 2015-01-19 18:27:21

4

这里是我一个演示中使用的填充可空日期景色的片段/时间

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; 
0
DateTime UpdatedTime = _objHotelPackageOrder.HasValue ? _objHotelPackageOrder.UpdatedDate.Value : DateTime.Now;