繁体   English   中英

System.DateTime? vs System.DateTime

[英]System.DateTime? vs System.DateTime

我正在写一些代码,需要从页面中的Calendar控件读取日期值(Ajax工具包:Calendar Extender)。

下面的代码:

DateTime newSelectedDate = myCalendarExtender.SelectedDate;

给出以下错误:

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

但是,通过插入强制转换,我可以使代码正常工作:

DateTime newSelectedDate = (DateTime)myCalendarExtender.SelectedDate; // works fine!

日历控件(Ajax工具箱)的“ SelectedDate”属性将数据类型描述为“ System.DateTime?”。 ...显然是“?” 与这一切有关。

当数据类型包含此符号(?)时,到底发生了什么?我想我可以将'SelectedDate'属性直接应用到'DateTime'类型的变量中,而无需进行转换。

谢谢

表示类型可以为空。 有关详细信息,请参见例如MSDN。

Nullable是值类型的编译器支持的包装器,该包装器允许值类型变为null。

要访问DateTime值,您需要执行以下操作:

DateTime? dateOrNull = myCalendarExtender.SelectedDate;
if (dateOrNull != null)
{
    DateTime newSelectedDate = dateOrNull.Value;
}

DateTime? Nullable<DateTime>相同,即: DateTime?的实例DateTime? 可以包含'NULL',而DateTime的实例不包含。 (从.NET 2.0开始的所有值类型都是如此。值类型不能包含NULL,但从.NET 2.0开始,可空值类型通过Nullable<T>构造(或?简写)得到支持。

您可以获取DateTime的值吗? 并通过以下操作将其放在DateTime中:

DateTime? someNullableDate;
DateTime myDate;

if( someNullableDate.HasValue )
   myDate = someNullableDate.Value;

另一种简洁的方法来获取Nullable的值,是通过使用null-coalescing运算符:

DateTime myDate = someNullableDate?? default(DateTime);

具有nullable类的更好的解决方案和IMO的所有优点

DateTime newSelectedDate = myCalendarExtender.SelectedDate.GetValueOrDefault();

由于DateTime是一个结构,因此Calendar控件在其SelectedDate属性中返回Nullable <DateTime>(C#中的简写为DateTime?)。 空值使控件具有“未选择日期”状态。 因此,您需要先检查nullable是否具有值,然后才能使用它。

var nullable = myCalendarExtender.SelectedDate;
var newSelectedDate = (nullable.HasValue) ? nullable.Value : SomeDefaultValue;

编辑:更加简洁,感谢乔希的评论:

var newSelectedDate = myCalendarExtender.SelectedDate ?? SomeDefaultValue;

我喜欢!

您可以使用?? 运算符,以便在C#中以非常简洁的方式处理nullable。 请参阅我对Travis答案的评论,以获得表达“如果不为null则使用它,否则使用一些默认值”概念的更短方法。 他们俩都做同样的事情。

var Endtime = DateTime.Now();
DateTime startTime = item.REPORT_TIME.HasValue ? item.REPORT_TIME.Value : Endtime;

意思是:item.item.REPORT_TIME的类型是system.DateTime?
但是startTime的类型是system.DateTime; 所以代码可以像

var Endtime = DateTime.Now; var startTime = item.REPORT_TIME.HasValue?Convert.ToDateTime(item.REPORT_TIME.HasValue):Endtime

`

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM