是否可以将通用列表转换为它的子类列表?

时间:2015-08-29 01:22:27

标签: c#

更具体地说,我有一个Graph类,它包含Vertex类型的List。 我有另一个扩展Graph的类,叫做Graph2D,我希望一个Vertex类型的List转换为Graph2D上Vertex2D类型的List。

这可能吗?

编辑:由shf301回答。感谢。

2 个答案:

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