不可能在字典中返回IEnumerable的子类型

本文关键字:类型 IEnumerable 返回 字典 不可能 | 更新日期: 2023-09-27 18:12:03

为什么这是c#中的一个问题?

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

不可能在字典中返回IEnumerable的子类型

这是不可能的,因为它将创建一个以IList<object>为值的字典。

所以如果你调用:

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

您返回的字典将接受IEnumerable<object>,但下面的字典将不接受它,因为它的值必须是IList<object>类型,而在这里,它不是。

你不能返回这个:

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

. .但是你可以返回这个:

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

. .或者更改返回类型:

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

这背后的部分原因:

想象一下,如果您可以将返回的Dictionary作为Dictionary<string, IEnumerable<object>>,但是值为List<object>而不是IEnumerable<object>(其中ListIEnumerable的更具体类型)。

如果您试图添加一个新的IEnumerable<object>到它,这将是一个无效的操作,因为您的元素实际上不是IEnumerable<object>类型,而是List<object>类型。

不允许的原因是List<object>类型的元素可能(并且确实)包含IEnumerable<object>不包含的方法。

想象将类型为IEnumerable<object>的元素添加到Dictionary<string, List<object>>。这意味着您可以在每个元素上调用特定于List<object>的方法,直到到达第一个IEnumerable<object>元素,在那里该方法没有被定义,并因此抛出异常。

您的原始代码会导致编译时错误,以阻止您遇到此类问题。

我自己不久前也问过一个相关的问题,这可能有助于更好地理解这一点。