2012-03-19 96 views
2

我有一個泛型集合路徑,其中T是段 - 段是抽象類。 我有一個包含從抽象基類段經由中間類線段派生類SpecialLineSegments路徑的派生類ClosedPath。 我想選擇滿足條件的路徑,然後我將修改它,使得它可以包含不同類型段的,可能不是一個ClosedPath了....所以我試圖轉換爲路徑。編譯器給出錯誤,表明這種轉換是不可能的。如何轉換爲普通集合

 public static void Method1(ClosedPath[] paths) 
     { 
      bool condition = false; 
      //working code.. 

      Path<Segment> Pslct = new Path<Segment>(); 
      foreach (ClosedPath P in paths) 
      { 
       if (condition) 
       { 
        //working code 

        Pslct = (Path<Segment>) P; 

       } 

      } 
     } 

路徑定義如下......

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 T this[int pos] 
    { 
     get { return (T)segments[pos]; } 
     set { segments[pos] = value; } 
    } 

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

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

    public void AddSegment(T s) {Segments.Add(s);} 

    public int Count {get {return Segments.Count;}} 

    IEnumerator<T> IEnumerable<T>.GetEnumerator() 
    { return Segments.GetEnumerator();} 
    IEnumerator IEnumerable.GetEnumerator() 
    { return Segments.GetEnumerator(); } 
} 

ClosedPath從

public class LinePath<T> : Path<T>, IEnumerable<T> where T : LineSegment 
    { 
     //working code 
    } 

線段源自段

+0

如何定義路徑? – 2012-03-19 14:00:50

+0

@James上面編輯 – gwizardry 2012-03-19 14:10:04

+0

寫一個顯式的轉換操作符。 – phoog 2012-03-19 14:10:34

回答

0

不能從ClosedPathPath<LineSegment>)轉換爲Path<Segment>派生是由於List<T>
例如:

List<Segment> foo = new List<LineSegment>(); //Will not compile 

如果您是直接轉換,你可以有一個Path<Segment>這是一個內部ClosedPath。這將導致AddSegment(Segment s)失敗,因爲它會嘗試添加Segment s到內部List<LineSegment>。因此,轉換時必須投射內部列表。

if (condition) 
{ 
    //working code 

    // Convert the ClosedPath LineSegments to Sements to create the Path<Segment> 
    Pslct = new Path<Segment>(P.Cast<Segment>().ToList()); 

<OldAnswer>

假設ClosedPath : LinePath<LineSegment>你應該能夠使用LINQ .Cast<>()

Path<Segment> Pslct = paths.Cast<Path<Segment>>(); 

</OldAnswer >

+0

是的。我沒有LINQ經驗....也許我應該快速閱讀LINQ。 – gwizardry 2012-03-19 14:31:35

+0

看了更多一點--Cast將無法工作。編輯答案。 – David 2012-03-19 14:44:40

+0

顯式轉換解決方案可以編譯,但在運行時測試之前還需要做其他一些事情。 – gwizardry 2012-03-19 14:47:49