如何将DateTime?转换为DateTime类型?

214

我想将可空的DateTime (DateTime?) 转换为 DateTime,但是我得到了一个错误:

不能隐式地将类型 'System.DateTime?' 转换为 'System.DateTime'。存在一种显式转换 (是否缺少强制转换?)

我尝试了以下代码:

DateTime UpdatedTime = (DateTime)_objHotelPackageOrder.UpdatedDate == null 
    ? DateTime.Now : _objHotelPackageOrder.UpdatedDate;
12个回答

359
你想使用空值合并运算符,这个操作符就是为了这个目的而设计的。
使用它,你最终会得到这段代码。
DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now;

3
这是我在填充一个可空的日期/时间视图时在 Presenter 中使用的代码片段:memDateLogin = m.memDateLogin ?? DateTime.MinValue - Ravi Ram
“DateTime?” 不包含“UpdatedDate”的定义。 - Vasil Valchev

97

微软已经为此创建了一个方法,因此您不必使用空值合并运算符。在功能上没有任何区别,但对于非专业人士来说,一眼就能理解发生了什么,这样更容易。

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

44

试一试这个

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

这里的关键是空值合并运算符,请参考chills42的答案获取更多信息。 - cspolton

33

你可以使用一个简单的投射:

DateTime dtValue = (DateTime) dtNullAbleSource;

在执行之前,你必须检查变量是否为空。

7
在执行+1操作前,最好先检查该变量是否为空。 - Leandro Bardelli

27
你需要调用可空 DateTime 的 Value 属性。这将返回一个 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;

6
以下内容如何:

如下:

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

6
这是我在Presenter中使用的代码片段,用于填充视图中的可空日期/时间。
memDateLogin = m.memDateLogin ?? DateTime.MinValue

3

您还可以尝试使用可空(T)属性

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

1
考虑使用以下内容,它比被接受的答案更好。
DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate == null 
    ? DateTime.Now : (DateTime)_objHotelPackageOrder.UpdatedDate;

2
有没有说一下为什么它更好的原因? - n4rzul

0

试试这个:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接