为什么对泛型列表进行显式强制转换不起作用 [英] why does explicit cast for generic list not work
问题描述
我正在尝试为派生类IntersectionPath构造一个构造器内的对象列表,如下所示.
I am trying to cast a list of objects within a consturctor for a derive class IntersectionPath as follows.
public class IntersectionPath : Path<IntersectionSegment>, IEnumerable
{
//Constructors
public IntersectionPath() : base() { Verts = null; }
public IntersectionPath(List<Intersection> inVerts, List<Segment<Node>> inEdges) : base()
{
this.Segments = (List<IntersectionSegment>) inEdges;
}
}
段是在通用基类Path中定义的
Segments is defined in the generic base class Path
public class Path<T> : IEnumerable<T> where T : Segment<Node>
{
//public properties
public List<Direction> Directions {get; set; }
public List<T> Segments { get; set; }
}
我已经为IntersectionSegment类中的转换定义了一个显式运算符(请参见下文,因此不清楚为什么不编译.我在IntersectionPath构造函数中有一个错误消息.
I have defined an explicit operator for the cast within the IntersectionSegment class (see below and so am unclear as to why this won't compile. I have an error message for the casting within the IntersectionPath constructor.
public class IntersectionSegment : Segment<Intersection>
{
//curves which intersect the primary curve at I0(Start Node) and I1(End Node)
public Curve C0 { get; set; }
public Curve C1 { get; set; }
public IntersectionSegment():base() {}
public IntersectionSegment(Intersection n0, Intersection n1):base(n0,n1){}
public static explicit operator IntersectionSegment(Segment<Node> s)
{
if ((s.Start is Intersection) && (s.End is Intersection))
{
return new IntersectionSegment(s.Start as Intersection,s.End as Intersection);
}
else return null;
}
public static explicit operator List<IntersectionSegment>(List<Segment<Node>> ls)
{
List<IntersectionSegment> lsout = new List<IntersectionSegment>();
foreach (Segment<Node> s in ls)
{
if ((s.Start is Intersection) && (s.End is Intersection))
{
lsout.Add(new IntersectionSegment(s.Start as Intersection,s.End as Intersection));
}
else return null;
}
return lsout;
}
细分定义为:
public class Segment <T> : Shape where T : Node
{
//generic properties
public T Start { get; set; }
public T End { get; set; }
}
推荐答案
List< InteractionSegment>
与 InteractionSegment
不同.将一种类型的列表转换为另一种类型的列表将不会转换每个项目.
您需要执行以下操作:
List<InteractionSegment>
is not the same as InteractionSegment
. Casting a list of one type to a list of another type won't cast each item.
You need to do something like this:
this.Segments = inEdges.Select(x => (InteractionSegment)x).ToList();
这使用LINQ to Objects将 inEdges
中的每个对象转换为 InteractionSegment
对象,并将结果放回列表,然后分配给 this.细分
.
This uses LINQ to Objects to cast each object in inEdges
to an InteractionSegment
object and puts the result back into a list that is then assigned to this.Segments
.
这篇关于为什么对泛型列表进行显式强制转换不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!