簡體   English   中英

System.DateTime? vs 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM