更具体地说,我有一个Graph类,它包含Vertex类型的List。 我有另一个扩展Graph的类,叫做Graph2D,我希望将一个Vertex类型的List转换为Graph2D上Vertex2D类型的List。
这可能吗?
编辑:由shf301回答。感谢。
答案 0 :(得分:1)
不能将列表强制转换为它的子类列表。没有合理的方法可以在不破坏类型安全的情况下工作。如果可能,请考虑以下代码
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!
列表列表必须抛出InvalidCastException
,因为您无法转换Vertex
to a Vertex2D
。
但是我怀疑你真正的问题是你想要Vertex2D
中继承自Vertex
的顶点列表来改变类型。你有这个:
class Graph {
public List<Vertex> Vertices { get; set; }
}
class Graph2D : Graph {
// Now I want vertices to only contain Vertex2D!
}
你可以完成这个我在Vertex上制作Graph generic:
class GraphBase<TVertex> where TVertex : Vertex {
public List<TVertex> Vertices { get; set; }
}
class Graph : GraphBase<Vertex> {
}
class Graph2D : GraphBase<Vertex2D> {
}
这确实打破了Graph和Graph2D之间的继承关系。如果这很重要,我建议实施非通用接口。此界面可以依赖于IEnumerable在{T
上covariant https://github.com/NguyenDuyPhong/merge_two_po_files的事实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; }}
}
答案 1 :(得分:-1)
Linq救援!!
var casted = TheVertexList.Cast<Vertex2D>().ToList();