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
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
`