2009-07-02 3 views
0

私は2つのクラス....小包とFundParcelを持っている...と私はスーパータイプののIListにサブタイプのIEnumerableを変換しようとしている....AddRangeを使用してサブクラス化アイテムを追加できないのはなぜですか?

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

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

これらを別のに使用されていますメソッド内のクラスを次のように

parcels.AddRange(fundParcels); 

私は基本的に「のArgを言うエラーが出ます:foreachステートメントは、に削減することができない理由

private IList<Parcel> ExtractParcels(IEnumerable<FundParcel> fundParcels) 
{ 
    var parcels = new List<Parcel>(); 

    foreach (var fp in fundParcels) 
     parcels.Add(fp); 

    return parcels; 
} 

を私は理解していないどのようなことですumentタイプ'System.Colection.Generic.IEnumerable<FundParcel>' is not assignable to parameter type 'System.Collections.Generic.IEnumerable<Parcel>'"

しかし、そのような場合parcels.Add作業の理由、私は理解していない...

私は全体の方法は、行と交換可能であるべきかのように感じる:

return (List<Parcel>)fundParcels; 

...またはサブタイプはそのスーパータイプのために置換する必要がありますので、多分方法がalltogether廃棄することができます。..

誰もが、この場合に必要であるかもしれないものの契約は、この場合にAddRangeであり、なぜループのために説明することができます?

+0

[なぜC#/ CLRがメソッドのオーバーライドのコ/コントラバリエーションをサポートしていないのですか?](http://stackoverflow.com/questions/837134/why-does-c-clr-not-support-method- override-co-contra-variance) – TheLethalCoder

答えて

4

This SOはおそらくあなたの質問に答えてくれるでしょうし、ある程度Co-/ Contra-varianceをサポートする予定のC#4.0についての参考になるでしょう。

+0

これはC#4.0で解決される既知の問題ですか? – mezoid

+1

"解決済み"という言葉が強すぎます - 一般的な問題はまだありますが、C#4はIEnumerable を含むいくつかのケースで修正されます。 –

1

このコードを検討:また、ベースクラスのコンテナから継承するクラス、上記のコードのコンテナが有効であり、継承されたクラスのリストは、オブジェクトが含まれているケースを生成する場合

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

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

基本クラスの

関連する問題