是否可以将泛型列表转换为其子类的列表?

本文关键字:列表 子类 转换 泛型 是否 | 更新日期: 2023-09-27 18:10:15

更具体地说,我有一个Graph类,它包含一个类型为Vertex的List。我有另一个类扩展图形称为Graph2D,我想转换类型的列表顶点到类型的列表在Graph2D上的Vertex2D

这可能吗?

编辑:shf301回答谢谢。

是否可以将泛型列表转换为其子类的列表?

不可以将一个列表强制转换为它的子类列表。没有合理的方法可以在不破坏类型安全的情况下工作。如果可能的话,考虑下面的代码

List<Vertex> list1 = new List<Vertex>();
list1.Add(new Vertex());
List<Vertex2D> list2 = (List<Vertex2D>)list1;
Vertex2D vertex2d = list2[0];  // Oh no the first element is a Vertex!

list list必须抛出一个InvalidCastException,因为你不能将Vertex转换为to a Vertex2D

然而,我怀疑你真正的问题是你想要从Vertex继承到改变类型的Vertex2D中的顶点列表。这是你有:

class Graph {
     public List<Vertex> Vertices { get; set; }
}
class Graph2D : Graph {
    // Now I want vertices to only contain Vertex2D!
}

你可以通过在顶点上创建泛型图来实现这个目标:

class GraphBase<TVertex> where TVertex : Vertex {
     public List<TVertex> Vertices { get; set; }
}
class Graph : GraphBase<Vertex> {
}
class Graph2D : GraphBase<Vertex2D> {
}

这会破坏Graph和Graph2D之间的继承关系。如果这很重要,我建议实现一个非泛型接口。这个接口可以依赖于IEnumerable在T上协变的事实:

interface IGraph {
     IEnumerable<Vertex> Vertices { get;}
}
 class GraphBase<TVertex> : IGraph where TVertex : Vertex {
     public List<TVertex> Vertices { get; set; }
     IEnumerable<Vertex> IGraph.Vertices { get { return Vertices; }}
}

Linq来救援!!

var casted = TheVertexList.Cast<Vertex2D>().ToList();