我正在写一些代码,我需要从我的页面中的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'类型的变量而不进行强制转换。
由于
答案 0 :(得分:46)
?表示该类型可以为空。有关细节,请参阅例如MSDN
Nullable是一个编译器支持的值类型包装器,它允许值类型变为空。
要访问DateTime值,您需要执行以下操作:
DateTime? dateOrNull = myCalendarExtender.SelectedDate;
if (dateOrNull != null)
{
DateTime newSelectedDate = dateOrNull.Value;
}
答案 1 :(得分:21)
DateTime?
与Nullable<DateTime>
相同
也就是说:DateTime?
的实例可以包含'NULL',而DateTime
的实例则不包含'NULL'。
(对于自.NET 2.0以来的所有值类型都是如此。值类型不能包含NULL,但是,从.NET 2.0开始,可以通过Nullable<T>
构造(或简写)来支持可空值类型。 / p>
你可以获得DateTime的值吗?并通过这样做把它放在DateTime中:
DateTime? someNullableDate;
DateTime myDate;
if( someNullableDate.HasValue )
myDate = someNullableDate.Value;
获取Nullable值的另一种更简洁的方法是使用null-coalescing运算符:
DateTime myDate = someNullableDate?? default(DateTime);
答案 2 :(得分:10)
一个更好的解决方案和IMO是可以为空的类
的最佳功能DateTime newSelectedDate = myCalendarExtender.SelectedDate.GetValueOrDefault();
答案 3 :(得分:9)
Calendar控件返回Nullable&lt; DateTime&gt; (在C#中的缩写是DateTime?)在其SelectedDate属性中,因为DateTime是一个结构。空值允许Control具有“无日期选择”状态。因此,您需要先检查可空值是否具有值,然后才能使用它。
var nullable = myCalendarExtender.SelectedDate; var newSelectedDate = (nullable.HasValue) ? nullable.Value : SomeDefaultValue;编辑:更简洁,感谢Josh的评论:
var newSelectedDate = myCalendarExtender.SelectedDate ?? SomeDefaultValue;
我喜欢它!
答案 4 :(得分:2)
你可以用??运算符在C#中以非常简洁的方式使用nullables。请参阅我对Travis的答案的评论,该答案用于表达“if not null然后使用其他使用某些默认值”概念的更短方式。他们都做同样的事情。
答案 5 :(得分:-1)
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
`