0

我有两个类.... Parcel 和 FundParcel ...我正在尝试将子类型的 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>'"

但如果是这样的话,那么我不明白为什么 parcels.Add 有效......

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

return (List<Parcel>)fundParcels;

...或者也许该方法可以一起废弃,因为子类型应该可以替代它们的超类型..

谁能解释在这种情况下与 AddRange 的关系以及为什么在这种情况下可能需要 for 循环?

4

2 回答 2

4

此 SO可能会回答您的问题,并且还会为您指出有关即将推出的 C# 4.0 的参考资料,该版本将在一定程度上支持 Co-/Contra-variance。

于 2009-07-02T05:03:42.070 回答
1

考虑这段代码:

void AddParcelToParcelList(List<Parcel> parcels) {
  parcels.add(new Parcel());
}

List<FundParcel> fundParcels = new List<FundParcels>();
AddParcelToParcelList(fundParcels);

如果继承类的容器也继承自基类的容器,则上述代码有效,并生成继承类列表包含基类对象的情况。

于 2009-07-02T05:12:35.290 回答