为什么这是C#中的问题?
public Dictionary<string, IEnumerable<object>> GetProducts() {
return new Dictionary<string, IList<object>>();
}
答案 0 :(得分:3)
这是不可能的,因为它会创建一个字典,IList<object>
作为值。
所以如果你打电话:
IEnumerable<object> values = someOtherObjectCollectionPerhapseSomethingFromLinq;
Dictionary<string, IEnumerable<object>> products = GetProducts();
products.Add("MyKey", values);
您的返回字典将接受IEnumerable<object>
,但字典不会接受它,因为它的值为IList<object>
类型,在此,它不是。
答案 1 :(得分: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
是更具体的{ {1}})。
如果您之后尝试向其添加新的IEnumerable
,那么这将是无效的操作,因为您的元素实际上不是IEnumerable<object>
类型,而是IEnumerable<object>
不允许的原因是List<object>
类型的元素可能(并且确实)包含List<object>
没有的方法。
想象一下,将IEnumerable<object>
类型的元素添加到IEnumerable<object>
。这意味着您可以在每个元素上调用Dictionary<string, List<object>>
特定的方法,直到到达第一个List<object>
- 元素,其中不会定义该方法,并因此抛出一个例外。
您的原始代码会导致编译时错误,从而阻止您遇到此类问题。
我自己在不久前问过related question,这可能有助于更好地理解这一点。