代码之家  ›  专栏  ›  技术社区  ›  mezoid

为什么不能使用addrange添加子类项目?

  •  0
  • mezoid  · 技术社区  · 15 年前

    我有两个班……package和fundpackage…我正在尝试将子类型的IEnumerable转换为父类型的IList…

    public class FundParcel : Parcel
    {
      /* properties defined here */
    }
    
    public class Parcel
    {
      /* properties defined here */
    }
    

    这些在另一个类中的方法中使用,如下所示:

    private IList<Parcel> ExtractParcels(IEnumerable<FundParcel> fundParcels)
    {
        var parcels = new List<Parcel>();
    
        foreach (var fp in fundParcels)
            parcels.Add(fp);
    
        return parcels;
    }
    

    我不明白为什么foreach语句不能简化为:

    parcels.AddRange(fundParcels);
    

    我基本上得到一个错误,上面写着“参数类型” 'System.Colection.Generic.IEnumerable<FundParcel>' is not assignable to parameter type 'System.Collections.Generic.IEnumerable<Parcel>'"

    但如果是这样的话,那我就不明白为什么要用包裹了。加上一些东西…

    我觉得整个方法应该可以替换为行:

    return (List<Parcel>)fundParcels;
    

    …或者该方法可以一起废弃,因为子类型应该是其父类型的可替换子类型。

    在这种情况下,有人能解释一下addrange是如何处理的吗?在这种情况下,为什么需要for循环?

    2 回复  |  直到 15 年前
        1
  •  4
  •   Community CDub    8 年前

    This SO 可能会回答你的问题,也会向你指出关于即将到来的C 4.0的参考文献,它将在一定程度上支持协变/逆变。

        2
  •  1
  •   Tal Pressman    15 年前

    考虑此代码:

    void AddParcelToParcelList(List<Parcel> parcels) {
      parcels.add(new Parcel());
    }
    
    List<FundParcel> fundParcels = new List<FundParcels>();
    AddParcelToParcelList(fundParcels);
    

    如果继承类的容器也继承自基类的容器,则上述代码将有效,并生成一个案例,其中继承类的列表包含基类的对象。

    推荐文章