系统日期时间?与 System.DateTime
Posted
技术标签:
【中文标题】系统日期时间?与 System.DateTime【英文标题】:System.DateTime? vs System.DateTime 【发布时间】:2010-12-16 07:38:48 【问题描述】:我正在编写一些代码,我需要从页面中的日历控件中读取日期值(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!
日历控件(Ajax 工具包)的“SelectedDate”属性将数据类型描述为“System.DateTime?” ......显然是'?与所有这些有关。
当数据类型包含此符号 (?) 时究竟会发生什么...我假设我可以将“SelectedDate”属性直接应用到“DateTime”类型的变量中而无需强制转换。
谢谢
【问题讨论】:
【参考方案1】:DateTime?
与Nullable<DateTime>
相同
也就是说:DateTime?
的实例可以包含“NULL”,而DateTime
的实例则不能。
(对于自 .NET 2.0 以来的所有值类型都是如此。值类型不能包含 NULL ,但从 .NET 2.0 开始,可以通过 Nullable<T>
构造(或 ? 简写)支持可空值类型。
你能得到DateTime的值吗?并通过这样做将其放入 DateTime:
DateTime? someNullableDate;
DateTime myDate;
if( someNullableDate.HasValue )
myDate = someNullableDate.Value;
获取 Nullable 值的另一种更简洁的方法是使用 null-coalescing 运算符:
DateTime myDate = someNullableDate?? default(DateTime);
【讨论】:
这是一个比答案更好的解决方案。【参考方案2】:var Endtime = DateTime.Now();
DateTime startTime = item.REPORT_TIME.HasValue ? item.REPORT_TIME.Value : Endtime;
意思是:item.item.REPORT_TIME的类型是system.DateTime? 但是 startTime 的类型是 system.DateTime; 所以代码可以像
一样改变它`var Endtime=DateTime.Now; var startTime=item.REPORT_TIME.HasValue?Convert.ToDateTime(item.REPORT_TIME.HasValue):Endtime
`
【讨论】:
您能否格式化您的代码并详细解释一下? 这是第一次给出答案,我会改变它。谢谢你的建议。【参考方案3】:Calendar 控件在其 SelectedDate 属性中返回 Nullable
编辑:更加简洁,感谢 Josh 的评论:
var newSelectedDate = myCalendarExtender.SelectedDate ??一些默认值;我喜欢!
【讨论】:
你可以用下面的代码来简化它: var newDate = nullable ??一些默认值; 或者您可以根据我的回答跳过所有存在检查自己。 @Chris - 我同意;但是,有时我不想使用像 DateTime 这样的值类型的默认值...也许我希望 DateTime.Today 作为评估中的默认值。【参考方案4】:?表示该类型可以为空。有关详细信息,请参见例如MSDN
Nullable 是一个编译器支持的值类型包装器,它允许值类型变为 null。
要访问 DateTime 值,您需要执行以下操作:
DateTime? dateOrNull = myCalendarExtender.SelectedDate;
if (dateOrNull != null)
DateTime newSelectedDate = dateOrNull.Value;
【讨论】:
@Marek - 你更喜欢原始网址?我为编辑道歉。 @Jeff:他也在他的编辑中添加了代码块,所以这很可能不是故意的改变......只是他在你编辑之前已经打开了编辑屏幕。 @Jeff:抱歉,这是无意的。我不知道你编辑了网址,我的编辑覆盖了你的。 唷,我不确定这种事情是否有问题。 :D 感谢所有回复的人,现在更有意义了! :)【参考方案5】:你可以使用 ??运算符在 C# 中以非常简洁的方式处理可空值。请参阅我对 Travis 的回答的评论,以更短的方式表达“如果不为空,则使用它,否则使用一些默认值”概念。他们都做同样的事情。
【讨论】:
【参考方案6】:一个更好的解决方案,IMO 是所有可空类的最佳功能
DateTime newSelectedDate = myCalendarExtender.SelectedDate.GetValueOrDefault();
【讨论】:
我会说这是非常巧妙的解决方案。以上是关于系统日期时间?与 System.DateTime的主要内容,如果未能解决你的问题,请参考以下文章
在Powershell中如何将日期'2017年6月6日,08:09:05.000'转换为[DateTime]?
NHibernate 无法将 MySQL 日期/时间值转换为 System.DateTime