2012-04-19 125 views
0

我有這樣的代碼:條件運算

private MyClass CreateObject(MyOtherClass myOtherClass) 
{ 
    return new MyClass 
    { 
     Name = myOtherClass.Name, 
     ValidationDate = (DateTime)myOtherClass.ValidationDate //ValidationDate is nullable 
    }; 
} 

如果我這樣做,我有一個編譯錯誤:

條件表達式的類型不能確定,因爲有 沒有隱轉換'<null>''System.DateTime'之間和

private MyClass CreateObject(MyOtherClass myOtherClass) 
{ 
    return new MyClass 
    { 
     Name = myOtherClass.Name, 
     ValidationDate = (myOtherClass.VALIDATION_DATE == null) ? null : DateTime.Now //ValidationDate is nullable 
    }; 
} 

如果我這樣做,沒有問題:

MyClass myClass = new MyClass(); 
if (myClass.ValidationDate == null) 
    myClass.ValidationDate = null; 

問題是爲什麼?和Solustion? :)

+1

「MyClass.ValidationDate」和「MyOtherClass.ValidationDate」的類型是什麼? – 2012-04-19 09:08:41

+1

當你說「如果我這樣做,沒有問題」。我不同意,你不在那裏做任何事。您將null設置爲已經爲null的值。 – 2012-04-19 09:09:19

+1

Nitpic - 空合併運算符是'??'。你在談論條件運算符'?:'。 – Oded 2012-04-19 09:10:36

回答

3

第一個代碼塊中的問題是您試圖將可空的DateTime值轉換爲DateTime。

試試看鑄造可空的DateTime(DateTime?)代替:

ValidationDate = (DateTime?)myOtherClass.ValidationDate 

因爲你想填充一個可空DateTime字段畢竟。

如果你想提供一個默認值的情況下,myOtherClass.ValidationDate爲空,然後使用合併運算符(無需強制轉換):

ValidationDate = myOtherClass.ValidationDate ?? DateTime.Now 
+0

這兩個字段都包含'DateTime?'。這對於有問題的條件語句有什麼幫助? – Oded 2012-04-19 09:09:34

+0

@Oded感謝您指出這一點;我沒有看到第二個代碼塊 – GolfWolf 2012-04-19 09:14:49

0

演員的nullDateTime?

ValidationDate = (myOtherClass.VALIDATION_DATE == null) ? 
                (DateTime?)null : DateTime.Now; 

條件運算符要求兩個結果分支具有可以隱式轉換的相同類型或類型。

由於null本身不符合任何類型的,你需要轉換分支 - 上述工作,因爲沒有爲DateTime.Now分支DateTimeDateTime?之間的隱式轉換。

0

空合併運算符實際上是??,它不會出現在代碼中的任何位置 - 您使用的是三元運算符。我相信爲了這個工作,兩個可能的結果(在這種情況下,nullDateTime.Now)需要轉換爲相同的類型(他們不是)。

嘗試轉產簡單:

ValidationDate = myOtherClass.VALIDATION_DATE ?? DateTime.Now; 
+0

中的'DateTime.Now'或者w0lf指出,通過將它們轉換爲可以爲空的日期時間使它們成爲相同的類型。 – Bridge 2012-04-19 09:10:57

0

如果ValidationDate在MyOtherClass是一個可空的日期時間,和ValidationDate在MyClass的是一個DateTime(不爲空),那麼你可以這樣做:

ValidationDate = myOtherClass.ValidationDate?? DateTime.Now