【问题标题】:Returning subtype of IEnumerable in Dictionary not possible无法在 Dictionary 中返回 IEnumerable 的子类型
【发布时间】:2013-04-27 20:35:15
【问题描述】:

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

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

【问题讨论】:

  • Jakob -- 以后请更详细地描述您的问题。这次似乎可以回答您的问题,但是对问题进行详细解释对那些试图回答您的问题的人很有帮助。

标签: c# dictionary ienumerable ilist


【解决方案1】:

这是不可能的,因为它会创建一个字典,将IList&lt;object&gt; 作为值。

所以如果你打电话:

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

您的返回字典将接受IEnumerable&lt;object&gt;,但字典underneat 将不接受它,因为它的值必须是IList&lt;object&gt; 类型,在本例中,它不是。

【讨论】:

    【解决方案2】:

    这个不能退货:

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

    .. 但你可以返回这个:

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

    .. 或更改您的返回类型:

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

    这背后的部分原因:

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

    如果您随后尝试向其中添加新的IEnumerable&lt;object&gt;,那将是一个无效操作,因为您的元素实际上不是IEnumerable&lt;object&gt; 类型,而是List&lt;object&gt;

    被禁止的原因是List&lt;object&gt; 类型的元素可能(并且确实)包含IEnumerable&lt;object&gt; 不包含的方法。

    想象一下将IEnumerable&lt;object&gt; 类型的元素添加到Dictionary&lt;string, List&lt;object&gt;&gt;。这意味着您可以在每个元素上调用List&lt;object&gt;-specific 方法直到您到达第一个IEnumerable&lt;object&gt;-元素,该方法不会被定义,因此抛出异常。

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

    不久前我自己问过related question,这可能有助于更好地理解这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-10
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      相关资源
      最近更新 更多