2013-05-03 37 views
3

爲什麼在C#中這是一個問題?返回字典中IEnumerable的子類型不可能

public Dictionary<string, IEnumerable<object>> GetProducts() { 
    return new Dictionary<string, IList<object>>(); 
} 
+0

雅各布 - 請在將來更加描述您的問題。看來你的問題能夠得到解答,但這個問題的詳細解釋對那些試圖回答你的問題的人有幫助。 – tnw 2013-05-03 12:47:19

回答

3

這是不可能的,因爲它會創建一個字典,作爲一個值爲IList<object>

所以,如果你撥打:

IEnumerable<object> values = someOtherObjectCollectionPerhapseSomethingFromLinq; 
Dictionary<string, IEnumerable<object>> products = GetProducts(); 
products.Add("MyKey", values); 

你返回字典將接受underneat不會接受它的IEnumerable<object>但字典,因爲它的值會被IList<object>型的,在這個就是,它不是「T。

1

不能返回此:

new Dictionary<string, IList<object>>(); 

..但是你可以返回此:

new Dictionary<string, IEnumerable<object>>(); 

..或者改變你的返回類型:

public Dictionary<string, IList<object>> GetProducts(){ ... } 

部分這背後的推理:

想象一下,如果可以將返回的字典作爲Dictionary<string, IEnumerable<object>>,但值爲List<object>而不是IEnumerable<object>(其中List是更具體的IEnumerable類型)。

如果再嘗試一個新的IEnumerable<object>添加到它,那將是一個無效的操作,因爲你的元素都沒有,事實上,IEnumerable<object>型的,而是List<object>

是不允許的原因,是(和不)List<object>類型可能的元件包含一個IEnumerable<object>不會方法。

想象一下,將IEnumerable<object>類型的元素添加到Dictionary<string, List<object>>。這意味着你可以在每個元素上調用List<object>特定的方法,直到你到達第一個IEnumerable<object> -element,其中該方法不會被定義,因此會拋出異常。

您的原始代碼會導致編譯時錯誤,使您無法進入此類問題。

我自己問了一個related question不久前,這可能會有助於更好地理解這一點。

相關問題