2012-03-19 4 views
2

일반 콜렉션 경로가 있습니다. 여기서 T는 세그먼트 - 세그먼트는 추상 클래스입니다. 중간 클래스 LineSegment를 통해 추상 기본 클래스 Segment의 파생 클래스 SpecialLineSegments가 포함 된 Path의 파생 클래스 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; 

       } 

      } 
     } 

경로

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 
    } 

선분에서 파생 된 ... 정의 당신은 Path<Segment>ClosedPath (Path<LineSegment>)에서 캐스팅 할 수없는 세그먼트

+0

어떻게 경로가 정의? –

+0

@James 위에 편집 됨 – gwizardry

+0

명시 적 변환 연산자를 작성하십시오. – phoog

답변

0

에서 유래로 인해 발생했습니다..
예 :

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

직접 변환 할 수 있다면, 당신은 내부적으로 ClosedPath이었다 Path<Segment>있을 수 있습니다. 이로 인해 AddSegment(Segment s)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

관련 문제