System.DateTime的? vs System.DateTime

时间:2009-11-13 14:29:32

标签: c# asp.net 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'类型的变量而不进行强制转换。

由于

6 个答案:

答案 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

`