为什么这是 C# 中的问题?
public Dictionary<string, IEnumerable<object>> GetProducts() {
return new Dictionary<string, IList<object>>();
}
为什么这是 C# 中的问题?
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);
您返回的字典将接受,IEnumerable<object>
但字典 underneat 不会接受它,因为它的值必须是 type 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>
(其中List
是更具体的类型IEnumerable
)。
如果您随后尝试向其中添加新IEnumerable<object>
元素,那将是无效操作,因为您的元素实际上不是 type IEnumerable<object>
,而是List<object>
.
不允许的原因是类型元素List<object>
可能(并且确实)包含 anIEnumerable<object>
不包含的方法。
想象一下将一个类型的元素添加IEnumerable<object>
到一个Dictionary<string, List<object>>
. 这意味着您可以List<object>
在每个元素上调用 - 特定方法,直到到达第一个-IEnumerable<object>
元素,该方法不会被定义,因此会引发异常。
您的原始代码会导致编译时错误,从而阻止您遇到此类问题。
不久前我自己问了一个相关问题,这可能有助于更好地理解这一点。