System.DateTime的? vs System.DateTime

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

代码如下:

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! 

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

当数据类型包含此符号时,究竟发生了什么?(?)…我假设我可以将’SelectedDate’属性直接应用于’DateTime’类型的变量而不进行强制转换。

谢谢

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

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

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

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

DateTime?Nullable相同即: DateTime?一个实例DateTime? 可以包含’NULL’,而DateTime的实例则不包含。 (对于自.NET 2.0以来的所有值类型都是如此。值类型不能包含NULL,但是,从.NET 2.0开始,可通过Nullable构造(或简写)支持可空值类型。

你可以获得DateTime的值吗? 并通过这样做把它放在DateTime中:

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

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

 DateTime myDate = someNullableDate?? default(DateTime); 

一个更好的解决方案和IMO是可空类的最佳function

 DateTime newSelectedDate = myCalendarExtender.SelectedDate.GetValueOrDefault(); 

Calendar控件在其SelectedDate属性中返回Nullable (C#中的缩写是DateTime?),因为DateTime是一个struct。 空值允许Control具有“无日期选择”状态。 因此,您需要先检查可空值是否具有值,然后才能使用它。

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

编辑:更简洁,感谢Josh的评论:

 var newSelectedDate = myCalendarExtender.SelectedDate ??  SomeDefaultValue;

我喜欢!

你可以用?? 运算符在C#中以非常简洁的方式使用nullables。 请参阅我对Travis答案的评论,该答案用于表达“if not null然后使用其他使用某些默认值”概念的更短方式。 他们都做同样的事情。

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

意思是:item.item.REPORT_TIME的类型是system.DateTime?
howerver startTime的类型是system.DateTime; 所以代码可以改变它

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

`