[英]cannot implicitly convert type System.DateTime? to System.DateTime
[英]System.DateTime? vs System.DateTime
我正在寫一些代碼,需要從頁面中的Calendar控件讀取日期值(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 = (DateTime)myCalendarExtender.SelectedDate; // works fine!
日歷控件(Ajax工具箱)的“ SelectedDate”屬性將數據類型描述為“ System.DateTime?”。 ...顯然是“?” 與這一切有關。
當數據類型包含此符號(?)時,到底發生了什么?我想我可以將'SelectedDate'屬性直接應用到'DateTime'類型的變量中,而無需進行轉換。
謝謝
? 表示類型可以為空。 有關詳細信息,請參見例如MSDN。
Nullable是值類型的編譯器支持的包裝器,該包裝器允許值類型變為null。
要訪問DateTime值,您需要執行以下操作:
DateTime? dateOrNull = myCalendarExtender.SelectedDate;
if (dateOrNull != null)
{
DateTime newSelectedDate = dateOrNull.Value;
}
DateTime?
與Nullable<DateTime>
相同,即: 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);
具有nullable類的更好的解決方案和IMO的所有優點
DateTime newSelectedDate = myCalendarExtender.SelectedDate.GetValueOrDefault();
由於DateTime是一個結構,因此Calendar控件在其SelectedDate屬性中返回Nullable <DateTime>(C#中的簡寫為DateTime?)。 空值使控件具有“未選擇日期”狀態。 因此,您需要先檢查nullable是否具有值,然后才能使用它。
var nullable = myCalendarExtender.SelectedDate; var newSelectedDate = (nullable.HasValue) ? nullable.Value : SomeDefaultValue;
編輯:更加簡潔,感謝喬希的評論:
var newSelectedDate = myCalendarExtender.SelectedDate ?? SomeDefaultValue;
我喜歡!
您可以使用?? 運算符,以便在C#中以非常簡潔的方式處理nullable。 請參閱我對Travis答案的評論,以獲得表達“如果不為null則使用它,否則使用一些默認值”概念的更短方法。 他們倆都做同樣的事情。
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
`
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.