2012-03-16 19 views
0

當嘗試在此派生類中設置泛型基本集合類成員時出現編譯器錯誤。如何設置基本成員泛型列表<T>使用派生特定列表<TUser>

error CS0029: Cannot implicitly convert type 'System.Collections.Generic.List<IntSegment>' to 'System.Collections.Generic.List<T>'

這裏是我的泛型集合

public class Path<T> : IEnumerable<T> where T : Segment 
{ 
    private List<T> segments = new List<T>(); 

    public List<T> Segments 
    { 
     set { segments = value; } 
     get { return this.segments; } 
    } 

    public Path() 
    { 
     this.Segments = new List<T>(); 
    } 

    public Path(List<T> s) 
    { 
     this.Segments = s; 
    } 
} 

派生泛型類此集合,然後對段的派生類IntSegment(基本集被定義爲其)定義

的輪廓
public class IntersectionClosedPath<T> : Path<T>, IEnumerable<T> where T : IntSegment 
{ 
    public IntersectionClosedPath(List<IntSegment> inEdges) 
     : base() 
    { 
     Segments = inEdges; 
    } 
} 

我不明白爲什麼這項任務是不允許的。 (我不需要製作傳入列表的深層副本)。

回答

5

List<IntSegment> inEdges更改爲List<T> inEdges它會工作。問題是Segments被稱爲List<T>,where T : IntSegment,而inEdgesList<IntSegment>。 (因爲我不會在這裏進入這裏,除非你問,這樣的任務是不允許的。如果你有興趣,請查看方差/協方差/對比。)

+0

+1這是一個很好的替代解決方案 – 2012-03-16 15:43:33

+0

謝謝你的工作......我將在後面記住閱讀材料。我想唯一的風險是我有一個集合,應該包含派生成員,但不 - 如果我意外地發送基地名單。我現在不擔心,所以沒問題。 – gwizardry 2012-03-16 15:50:28

+0

非常新泛型....但享受與他們實現的可能性! – gwizardry 2012-03-16 15:52:51

4

一個經典問題。 A List<Derived>不能隱式轉換爲List<Base>

您可以投在List<Derived>的項目,並創建一個List<Base>這樣的:

listOfBase = listOfDerived.Cast<Base>().ToList(); 
+1

我是一個學生,但這不會相當工作 - '鑄()'返回'IEnumerable ',而不是'List ' – 2012-03-16 15:40:56

+0

Grr!忘記ToList。現在修復。 – 2012-03-16 15:42:10

+0

我不太明白這一點,因爲我不是想從基礎轉換到派生,而是相反。 – gwizardry 2012-03-16 15:49:30

3

一個List<T>不等同於一個List<TBase>其中T : TBase

爲什麼?由於List<T>不是繼承List<TBase>,只有泛型類型參數相關。

你可以做,而不是在構造:

Segments = inEdges.Cast<Segment>().ToList() 

我也會改變構造參數IEnumerable<IntSegment>

同樣,它也可能是@Tim S.具有基於最好的解決辦法是什麼你想實現。我個人認爲他可能釘了它。

+0

我是否認爲在任何選擇中,當我在轉換後訪問細分列表時,我仍然可以訪問IntSegment成員? – gwizardry 2012-03-16 16:04:06

+0

@gwizardry - 在'IntersectionClosedPath'中。 – 2012-03-16 16:39:53