2010-03-15 72 views
8

可能顯示的文件:
Nullable types and the ternary operator. Why won’t this work?
Conditional operator assignment with nullable<value> types?爲什麼條件運算符不能正確地允許使用「null」賦值給可爲空的類型?

這不會編譯,陳述「不能確定條件表達式的類型,因爲有‘的System.DateTime’之間的隱式轉換''「

task.ActualEndDate = TextBoxActualEndDate.Text != "" ? DateTime.Parse(TextBoxActualEndDate.Text) : null; 

T他的作品就好了

if (TextBoxActualEndDate.Text != "") 
    task.ActualEndDate = DateTime.Parse(TextBoxActualEndDate.Text); 
else 
    task.ActualEndDate = null; 
+2

你可以擺脫你的代碼的依賴關係,所以我們可以重現這一點?例如,將'task.ActualEndDate'替換爲本地變量。 – 2010-03-15 22:22:24

+1

'int? q =真? 3:null;' – SLaks 2010-03-15 22:23:33

回答

8

這不起作用,因爲編譯器不會一次插入兩側的隱式轉換,並null需要隱式轉換成爲可空類型。

相反,你可以寫

task.ActualEndDate = TextBoxActualEndDate.Text != "" ? 
    DateTime.Parse(TextBoxActualEndDate.Text) : new DateTime?(); 

這隻需要一個隱式轉換(DateTimeDateTime?)。

或者,您也可以施放任何左側:

task.ActualEndDate = TextBoxActualEndDate.Text != "" ? 
    (DateTime?)DateTime.Parse(TextBoxActualEndDate.Text) : null; 

這也只需要一個隱式轉換。

+0

你真的應該在那裏使用DateTime.TryParse(TextBoxActualEndDate.Text,out someDateVar)。永遠不要相信輸入給你一個可解析的字符串。 – Tomas 2010-03-15 22:26:18

+2

是的,但它不是我的代碼。 – SLaks 2010-03-15 22:26:44

+2

驗證發生在這個解析之前的幾個地方,並且當我嘗試將DateTime.Min插入到數據庫中時,現在我更喜歡一個異常,而不是一個。 – 2010-03-15 22:37:03

4

條件運算符不會查看返回的值。它只查看要求選擇的值:DateTime和null。它不能將它們識別爲相同類型的實例(因爲null不是有效的DateTime),因此是錯誤。你和我知道Nullable<DateTime>可以完成這項工作,但條件運算符不允許引入「更大」的類型:只允許查看它所選擇的兩個表達式的類型。 (感謝Aaronaught在澄清這點和一個漂亮的澄清實例評論。)

要解決這個問題,通過鑄造日期時間爲操作員提供一個提示:

TextBoxActualEndDate.Text != "" ? (DateTime?)(DateTime.Parse(TextBoxActualEndDate.Text)) : null; 
            ^^^^^^^^^^^ 
+2

大部分正確(+1):'DateTime.Parse'返回一個'DateTime'(不是'Nullable '),它是一個值類型,並且沒有向'null'的轉換。編譯器在嘗試解析表達式時,不能將「更大」類型引入到方程中,它只能用於實際存在的類型。這是你不能寫'Stream s = expr的原因嗎?新的MemoryStream():新的FileStream(...)'。 – Aaronaught 2010-03-15 22:29:50

+0

Aaronaught:很好的解釋 - 我將摺疊。 – itowlson 2010-03-15 23:35:08

0

的原因是空的object型的,所以你必須將它轉換爲正確的類型,就像這樣:

task.ActualEndDate = TextBoxActualEndDate.Text != "" ? 
    DateTime.Parse(TextBoxActualEndDate.Text) : ((DateTime?) null); 
0

最正確的方式(IMO)是這樣做

task.ActualEndDate = TextBoxActualEndDate.Text != "" ? 
    (DateTime?)(DateTime.Parse(TextBoxActualEndDate.Text) : null); 

我以這種方式經常使用空拼接運算符。

0

這可能是錯誤,你在這種情況下獲得:

錯誤CS0173:條件 表達式的類型無法確定 因爲「之間」和「廉政」)

無隱 轉換

編譯器正在解釋它不知道如何將null轉換爲DateTime


修復:

需要castexplicitlyexpression可能返回nullnullable類型。這將工作

((DateTime?) null); 
相關問題