是否可以将泛型列表转换为其子类的列表?
本文关键字:列表 子类 转换 泛型 是否 | 更新日期: 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();