在Dictionary中返回IEnumerable的子类型是不可能的

时间:2013-05-03 12:27:26

标签: c# dictionary ienumerable ilist

为什么这是C#中的问题?

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

2 个答案:

答案 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,这可能有助于更好地理解这一点。