Как привести в общую коллекцию - PullRequest
2 голосов
/ 19 марта 2012

У меня есть общая коллекция Path, где T - это сегмент, а сегмент - это абстрактный класс.У меня есть производный класс ClosedPath of Path, который содержит производные классы SpecialLineSegments из абстрактного базового класса Segment через промежуточный класс LineSegment.Я пытаюсь выбрать путь, который удовлетворяет условию, и затем я изменю его так, чтобы он мог содержать разные типы сегментов и больше не являлся 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
  }

LineSegment происходит от сегмента

1 Ответ

0 голосов
/ 19 марта 2012

Вы не можете разыграть от ClosedPath (Path<LineSegment>) до Path<Segment> из-за List<T>.
ex:

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

При условии, что ClosedPath : LinePath<LineSegment> вы сможете использовать LINQ .Cast<>().

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

...