Dal*_*Dal 27 c# asp.net datetime
我正在写一些代码,我需要从我的页面中的Calendar控件读取日期值(Ajax工具包:日历扩展器).
代码如下:
DateTime newSelectedDate = myCalendarExtender.SelectedDate;
Run Code Online (Sandbox Code Playgroud)
给出以下错误:
Cannot implicitly convert type 'System.DateTime?' to 'System.DateTime'. An explicit conversion exists (are you missing a cast?)
Run Code Online (Sandbox Code Playgroud)
但是,通过插入一个演员我可以得到代码工作:
DateTime newSelectedDate = (DateTime)myCalendarExtender.SelectedDate; // works fine!
Run Code Online (Sandbox Code Playgroud)
日历控件的"SelectedDate"属性(Ajax工具包)将数据类型描述为"System.DateTime?" ......显然'?' 与所有这些有关.
当数据类型包含此符号时,究竟发生了什么?(?)...我假设我可以将'SelectedDate'属性直接应用于'DateTime'类型的变量而不进行强制转换.
谢谢
Mar*_*rek 46
?表示该类型可以为空.有关详细信息,请参阅例如MSDN
Nullable是一个编译器支持的值类型包装器,它允许值类型变为null.
要访问DateTime值,您需要执行以下操作:
DateTime? dateOrNull = myCalendarExtender.SelectedDate;
if (dateOrNull != null)
{
DateTime newSelectedDate = dateOrNull.Value;
}
Run Code Online (Sandbox Code Playgroud)
Fre*_*els 22
DateTime?与以下内容相同Nullable<DateTime>
:一个实例DateTime?可以包含'NULL',而实例DateTime则不包含'NULL' .(对于自.NET 2.0以来的所有值类型都是如此.值类型不能包含NULL,但是,从.NET 2.0开始,可通过Nullable<T>构造(或简写)支持可空值类型.
你可以获得DateTime的值吗?并通过这样做把它放在DateTime中:
DateTime? someNullableDate;
DateTime myDate;
if( someNullableDate.HasValue )
myDate = someNullableDate.Value;
Run Code Online (Sandbox Code Playgroud)
获取Nullable值的另一种更简洁的方法是使用null-coalescing运算符:
DateTime myDate = someNullableDate?? default(DateTime);
Run Code Online (Sandbox Code Playgroud)
Chr*_*sic 10
一个更好的解决方案和IMO是可空类的最佳功能
DateTime newSelectedDate = myCalendarExtender.SelectedDate.GetValueOrDefault();
Run Code Online (Sandbox Code Playgroud)
Calendar控件在其SelectedDate属性中返回Nullable <DateTime>(C#中的缩写是DateTime?),因为DateTime是一个struct.空值允许Control具有"无日期选择"状态.因此,您需要先检查可空值是否具有值,然后才能使用它.
var nullable = myCalendarExtender.SelectedDate; var newSelectedDate = (nullable.HasValue) ? nullable.Value : SomeDefaultValue;
编辑:更简洁,感谢Josh的评论:
var newSelectedDate = myCalendarExtender.SelectedDate ?? SomeDefaultValue;
我喜欢!