2016-06-28 67 views
0

所以我從Google日曆事件中獲取事件數據。我有一個類Google.Apis.Calendar.v3.Data.Event的變量item。有一個名爲Start的屬性,這是甚至開始的時候。如果它設置在一天中的某個時間,那麼Start.DateTime將會有一個值。如果是全天事件,則Start.DateTime將爲空,並且它將有一個單獨的屬性Start.Date,這是由於某種原因的字符串。如果Start.DateTime沒有值,我想獲得值爲insead的Start.Date。下面是相關的代碼:c#如果語句塊即使執行爲false

if (item.Start.DateTime.HasValue) 
       { 
        newEvent.Start = (DateTime)item.Start.DateTime; 
        newEvent.End = (DateTime)item.End.DateTime; 
       } else 
       { 
        string StartDay = item.Start.Date; 
        string EndDay = item.End.Date; 
       } 

所以,當我在一個普通的DateTime的日期運行它,我看到:

DateTime.HasValue is true

而且它的值,因爲它應該分配給NewEvent.Start 。大。

現在我有一整天的活動,其中Start.DateTime爲空運行:

DateTime.HasValue is false

所以應該跳到else語句,但是它沒有:

Start still gets a value

即使條件爲false,newEvent.Start仍會分配一個值。 else語句不被執行。這是怎麼回事?

回答

4

因爲DateTime是一個值類型,所以它不能有非值。因此,您在調試器中看到的只是它的默認值,但是您的if語句不會被執行。只有調試器爲您的變量顯示任何東西,因爲它不能顯示null。顯然,您的會員StartDateTime,而item.Start返回DateTime?

當你在if範圍內的語句中放置一個斷點時,你會發現它永遠不會被執行。只有調試器創建這個值,沒有任何東西被分配給你的變量 - 除了它的默認值,顯然是0001年1月1日,當定義你的變量。因此,無論您如何定義newEvent,這是設置此默認值的行 - 不在if-陳述內。

+0

是的,我現在看到。它工作正常,DateTime只有默認值。謝謝。 – jimboweb

1

如您所期望的跳過代碼。但無論如何newEvent.Start都有一個值,可能是因爲它的類型爲DateTime,它不能爲空。

1

這是DataTime類型的默認值。您可以使用Nullable DataTime來達到您的目的。

DateTime? d = null; 
bool boolNotSet = d.HasValue; 
0

DateTime是C#中的結構;這樣做的一個結果是其成員變量始終被初始化,在這種情況下,值爲1/1/0001 12:00:00 AM,這也等於DateTime.MinValuedefault(DateTime)。另一個結果是結構按值傳遞,不能爲空。

如果你想有一個DateTime「null」狀態,你可能想要使用Nullable<T>(或簡寫?)在你的事件類:

public class NewEvent { 
    public DateTime? Start { get; set; } 
    public DateTime? End { get; set; } 
} 

Nullable<T>給你HasValue屬性來檢查對象是否被賦值或沒有。

+0

我應該指定這實際上是類DateTime?意味着它是可空的。這就是爲什麼.HasValue屬性存在的原因(如果它不爲空,那麼不會有.HasValue屬性。)這也是爲什麼.HasValue語句在條件中顯示爲false的原因。 – jimboweb

+0

我明白你現在說的話。對不起,我誤解了。 – jimboweb

相關問題