爲什麼在C#中這是一個問題?返回字典中IEnumerable的子類型不可能
public Dictionary<string, IEnumerable<object>> GetProducts() {
return new Dictionary<string, IList<object>>();
}
爲什麼在C#中這是一個問題?返回字典中IEnumerable的子類型不可能
public Dictionary<string, IEnumerable<object>> GetProducts() {
return new Dictionary<string, IList<object>>();
}
這是不可能的,因爲它會創建一個字典,作爲一個值爲IList<object>
。
所以,如果你撥打:
IEnumerable<object> values = someOtherObjectCollectionPerhapseSomethingFromLinq;
Dictionary<string, IEnumerable<object>> products = GetProducts();
products.Add("MyKey", values);
你返回字典將接受underneat不會接受它的IEnumerable<object>
但字典,因爲它的值會被IList<object>
型的,在這個就是,它不是「T。
不能返回此:
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不久前,這可能會有助於更好地理解這一點。
雅各布 - 請在將來更加描述您的問題。看來你的問題能夠得到解答,但這個問題的詳細解釋對那些試圖回答你的問題的人有幫助。 – tnw 2013-05-03 12:47:19