2012-03-19 18 views
2

私はジェネリックコレクションパスを持ちます。ここで、Tはセグメント - セグメントは抽象クラスです。 私は、中間クラスLineSegmentを介して抽象基本クラスから派生クラスSpecialLineSegmentsを含むパスの派生クラスClosedPathを持っています。 条件に合致するパスを選択しようとしていますが、異なるタイプのセグメントが含まれている可能性がありますので、ClosedPathではない可能性がありますので、Pathにキャストしようとしています。コンパイラはこのキャストが不可能であるというエラーを出します。ジェネリックコレクションにキャストする方法

 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; 

       } 

      } 
     } 

線分あなたはPath<Segment>ClosedPathPath<LineSegment>)からキャストすることはできませんセグメント

+0

どのようにパスが定義されていますか? –

+0

@James上に編集 – gwizardry

+0

明示的な変換演算子を記述します。 – phoog

答えて

0

から派生

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

由来次のようにパスが定義されている...

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によるものです。
例:

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

あなたが直接変換した場合、あなたは内部ClosedPathPath<Segment>を持つことができます。これにより、は、List<LineSegment>Segment sを追加しようとすると失敗することになります。したがって、変換するときに内部リストをキャストする必要があります。あなたはLINQ .Cast<>()使用することができるはずClosedPath : LinePath<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>

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

</OldAnswer >

+0

はい、あります。私はLINQの経験がありません....おそらく、私はLINQで高速に読んでいるはずです。 – gwizardry

+0

これをもう少し見て - 。キャストは動作しません。編集された答え。 – David

+0

明示的変換ソリューションはコンパイルされますが、実行時にテストする前にいくつかのことを行う必要があります。 – gwizardry

関連する問題