3

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

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

2 回答 2

3

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

所以如果你打电话:

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

您返回的字典将接受,IEnumerable<object>但字典 underneat 不会接受它,因为它的值必须是 type IList<object>,在这种情况下,它不是。

于 2013-05-03T12:35:45.630 回答
1

你不能返回这个:

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>(其中List是更具体的类型IEnumerable)。

如果您随后尝试向其中添加新IEnumerable<object>元素,那将是无效操作,因为您的元素实际上不是 type IEnumerable<object>,而是List<object>.

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

想象一下将一个类型的元素添加IEnumerable<object>到一个Dictionary<string, List<object>>. 这意味着您可以List<object>在每个元素上调用 - 特定方法,直到到达第一个-IEnumerable<object>元素,该方法不会被定义,因此会引发异常。

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

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

于 2013-05-03T12:41:39.160 回答