2009-07-02 87 views
0

我有兩個類....包裹和FundParcel ......,我想一個IEnumerable轉換的子類型的超類型的一個IList的....爲什麼我不能使用AddRange添加子類項目?

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); 

我基本上得到,說:「精氨酸錯誤ument型'System.Colection.Generic.IEnumerable<FundParcel>' is not assignable to parameter type 'System.Collections.Generic.IEnumerable<Parcel>'"

但是,如果是這樣的話,那麼我不明白爲什麼parcels.Add工程...

我覺得好像整個方法應該是可更換的與線:

return (List<Parcel>)fundParcels; 

...也許該方法可以報廢產品總數自亞型應該是替代其超..

誰能解釋這筆交易是用什麼的AddRange在這種情況下,爲什麼for循環可能會在這種情況下,有必要?

+0

可能的重複[爲什麼C#/ CLR不支持方法重寫co/contra-variance?](http://stackoverflow.com/questions/837134/why-does-c-clr-not-support-method- override-co-contra-variance) – TheLethalCoder 2016-06-13 13:30:35

回答

4

This SO可能會回答你的問題,也會指出你即將到來的C#4.0的參考資料,它將在一定程度上支持共同/反方差。

+0

那麼這是一個將在C#4.0中解決的已知問題? – mezoid 2009-07-02 05:14:27

1

考慮以下代碼:

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

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

如果繼承的類也從基類的容器繼承,上面的代碼將是有效的,並且產生的情況下的容器,其中繼承的類的列表包含對象的基類。

相關問題