0

私には2つのクラスがあります...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>'"

しかし、そうだとすれば、なぜ小包を追加するのかわかりません...

メソッド全体を次の行に置き換える必要があるように感じます。

return (List<Parcel>)fundParcels;

...または、サブタイプはスーパータイプの代わりに使用できる必要があるため、メソッドを完全に破棄することもできます。

この場合のAddRangeとの取引と、この場合にforループが必要になる理由を誰かが説明できますか?

4

2 に答える 2

4

このSOはおそらくあなたの質問に答え、ある程度の共分散/逆分散をサポートする今後のC#4.0に関するリファレンスを示します。

于 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 に答える