2011-06-28 54 views
5
var dict = new Dictionary<string, object>(); 
DateTime? myDate; 

/*Next line gives: Type of conditional expression cannot be 
determined because there is no implicit conversion between 'System.DateTime?' 
and 'System.DBNull' */ 

dict.Add("breakit", myDate.HasValue ? myDate.Value : DBNull.Value); 

我不明白爲什麼需要有一個隱式轉換,如果其中一個要進入期望類型爲Object的字典。爲什麼我不能用這個表達式使用三元運算符?

+2

這是一個非常常見的問題上左右。有關詳細信息,請參閱http://stackoverflow.com/questions/2215745/conditional-operator-cannot-cast-implicitly/2215959#2215959。另見我的相關文章http://blogs.msdn.com/b/ericlippert/archive/2010/05/27/cast-operators-do-not-obey-the-distributive-law.aspx –

+0

@Eric我會一探究竟。謝謝! – scottm

+1

不客氣。問題在於,你的推理方向與編譯器原因相反。你在說:「我知道這是一種期待對象的東西」。但是編譯器並不知道你*先驗*希望選擇「對象」方法。編譯器試圖以另一種方式推理。它問的是「期望對象與這個表達式兼容的方法嗎?」要知道它必須問「表達式的類型是什麼?」 **問題是它無法計算出表達式的類型以決定表達式是否有效。** –

回答

6

在C#中,每個條件表達式都必須有一個類型。你表達的是什麼類型?

我明白你的擔心,你的特殊情況不需要轉換,但這是C#編譯器的工作原理,所以你必須遵守它的規則。

這應該工作而不是(我沒有,雖然檢查):

dict.Add("breakit", myDate.HasValue ? (object)myDate.Value : (object)DBNull.Value); 
+0

我的表達式應該是System.DateTime或者是DBNull類型,具體取決於myDate.Value的條件 – scottm

+0

Casting to對象確實有效。 – scottm

+0

那麼它不是一個靜態類型,而是一個動態類型。 C#編譯器是靜態類型的(除了一些'動態'機制我不完全確定)。 – Zruty

1

你嘗試:

DateTime? date = myDate.HasValue ? myDate.Value : null; 

dict.Add("breakit", date); 
+1

這給出了同樣的錯誤。 – scottm

+0

即使我不明白爲什麼我們需要在它是主基類時進行對象拋棄! –

相關問題