Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何转换为泛型集合_C#_Generics_Casting_Abstract Class - Fatal编程技术网

C# 如何转换为泛型集合

C# 如何转换为泛型集合,c#,generics,casting,abstract-class,C#,Generics,Casting,Abstract Class,我有一个通用的集合路径,其中T是段-段是抽象类。 我有一个路径的派生类ClosedPath,它包含从抽象基类段通过中间类LineSegment导出的派生类SpecialLineSegments。 我正在尝试选择符合条件的路径,然后我将对其进行修改,使其可能包含不同类型的段,并且可能不再是闭合路径……因此我正在尝试转换为路径。编译器给出错误消息,表示无法执行此强制转换 public static void Method1(ClosedPath[] paths) {

我有一个通用的集合路径,其中T是段-段是抽象类。 我有一个路径的派生类ClosedPath,它包含从抽象基类段通过中间类LineSegment导出的派生类SpecialLineSegments。 我正在尝试选择符合条件的路径,然后我将对其进行修改,使其可能包含不同类型的段,并且可能不再是闭合路径……因此我正在尝试转换为路径。编译器给出错误消息,表示无法执行此强制转换

       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源于段

无法从ClosedPath路径转换为由于列表原因而导致的路径。 例:

假设ClosedPath:LinePath,您应该能够使用LINQ.Cast

由于列表原因,无法从ClosedPath路径转换为路径。 例:

假设ClosedPath:LinePath,您应该能够使用LINQ.Cast


写一个显式转换操作符。我想我可以做到这一点,但我也认为显式转换操作符只适用于不相关的继承类。我本以为我的两个路径Path和ClosedPath通过继承关系。ClosedPath的基类是什么?从Path派生的泛型类…将在上面进行编辑。我正在使用Visual Studio 2010…所以不确定。请编写一个显式转换运算符。我本以为可以这样做,但我也认为显式转换运算符仅用于不相关的类被继承。我本以为我的两个路径Path和ClosedPath是通过继承关联的。ClosedPath的基类是什么?从Path派生的泛型类…将在上面进行编辑。我使用的是Visual Studio 2010…所以不确定。是的。我没有LINQ的经验…也许我应该快速阅读LINQ。多看一点这个-。演员阵容不起作用。已编辑的答案。显式转换解决方案可以编译,但在运行时测试之前还有一些其他的事情要做。由于列表是不变的,这就给这些类之间的转换工作带来了麻烦。在使用提供的代码段在我的终端上运行了一些测试之后。Cast无法按预期工作-您可能需要手动执行转换。请参见上文是的,它可以。我没有LINQ的经验…也许我应该快速阅读LINQ。多看一点这个-。演员阵容不起作用。已编辑的答案。显式转换解决方案可以编译,但在运行时测试之前还有一些其他的事情要做。由于列表是不变的,这就给这些类之间的转换工作带来了麻烦。在使用提供的代码段在我的终端上运行了一些测试之后。Cast无法按预期工作-您可能需要手动执行转换,请参见上文
List<Segment> foo = new List<LineSegment>(); //Will not compile
if (condition)
{
    //working code

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