C# 系统日期时间?vs.System.DateTime

C# 系统日期时间?vs.System.DateTime,c#,asp.net,datetime,C#,Asp.net,Datetime,我正在编写一些代码,需要从页面中的日历控件读取日期值(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?)

我正在编写一些代码,需要从页面中的日历控件读取日期值(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 = 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'类型的变量中,而无需强制转换


谢谢

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

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

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

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

DateTime?
Nullable
也就是说:
DateTime?
的实例可以包含“NULL”,而
DateTime
的实例则不包含。 (这适用于.NET 2.0之后的所有值类型。值类型不能包含NULL,但从.NET 2.0开始,通过
nullable
构造(或简写)支持可为NULL的值类型。)

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

DateTime? someNullableDate;
DateTime myDate;

if( someNullableDate.HasValue )
   myDate = someNullableDate.Value;
获取Nullable值的另一种更简洁的方法是使用null合并运算符:

DateTime myDate = someNullableDate?? default(DateTime);

Calendar控件在其SelectedDate属性中返回一个可空值(简写为C#是DateTime吗?),因为DateTime是一个结构。空值允许控件具有“no date selected”状态。因此,在使用它之前,需要检查该可空值是否有值

var nullable = myCalendarExtender.SelectedDate; var newSelectedDate = (nullable.HasValue) ? nullable.Value : SomeDefaultValue; var nullable=myCalendarExtender.SelectedDate; var newSelectedDate=(nullable.HasValue)?nullable.Value:SomeDefaultValue; 编辑:更简洁,感谢Josh的评论:

var newSelectedDate = myCalendarExtender.SelectedDate ?? SomeDefaultValue; var newSelectedDate=myCalendarExtender.SelectedDate??SomeDefaultValue;
我喜欢它!

这是一个更好的解决方案,而且是可空类的最佳特性

DateTime newSelectedDate = myCalendarExtender.SelectedDate.GetValueOrDefault();

在C#中,您可以使用??运算符以非常简洁的方式处理可空值。请参阅我对Travis答案的评论,了解表达“如果不为null,则使用它,否则使用某些默认值”概念的较短方式。它们都做相同的事情

var Endtime = DateTime.Now();
DateTime startTime = item.REPORT_TIME.HasValue ? item.REPORT_TIME.Value : Endtime;
表示:item.item.REPORT\u TIME的类型为system.DateTime?
然而,startTime的类型是system.DateTime; 所以代码可以像这样改变它

`var Endtime=DateTime.Now; var startTime=item.REPORT\u TIME.HasValue?Convert.ToDateTime(item.REPORT\u TIME.HasValue):Endtime


`

@Marek-你更喜欢原始url?我为编辑道歉。@杰夫:他也在编辑中添加了代码块,所以这很可能不是故意的更改……只是在你编辑之前他已经打开了编辑屏幕。@Jeff:抱歉,这是无意的。我不知道你编辑了url,我的编辑比你的编辑更重要。呸,我不是确定这类事情是否出了问题。:d感谢所有回复的人,现在它变得更有意义了!:)您可以用以下内容来简化它:var newDate=nullable??违约;或者你可以跳过所有的存在,按照我的回答检查你自己。@Chris-我同意;但是,有时我不想使用DateTime之类的值类型的默认值。。。也许我想要DateTime。今天是我在评估中的默认值。你能格式化你的代码并解释更多细节吗?这是第一次给出答案,我会更改它。谢谢你的建议。这是一个比答案更好的解决方案。我会说这是一个更简洁的解决方案。