如何设置基成员泛型List<;T>;使用派生的特定列表<;TUser>;
本文关键字:gt lt 派生 TUser 列表 何设置 成员 泛型 List 设置 | 更新日期: 2023-09-27 18:28:13
当我试图在此派生类中设置泛型基类集合类成员时,出现编译器错误。
error CS0029: Cannot implicitly convert type 'System.Collections.Generic.List<IntSegment>' to 'System.Collections.Generic.List<T>'
这是我的通用系列的概要
public class Path<T> : IEnumerable<T> where T : Segment
{
private List<T> segments = new List<T>();
public List<T> Segments
{
set { segments = value; }
get { return this.segments; }
}
public Path()
{
this.Segments = new List<T>();
}
public Path(List<T> s)
{
this.Segments = s;
}
}
然后为段的派生类IntSegment(为其定义基本集合)定义该集合的派生泛型类
public class IntersectionClosedPath<T> : Path<T>, IEnumerable<T> where T : IntSegment
{
public IntersectionClosedPath(List<IntSegment> inEdges)
: base()
{
Segments = inEdges;
}
}
我不明白为什么这项任务不被允许。(我不需要对即将到来的列表进行深入复制)。
将List<IntSegment> inEdges
更改为List<T> inEdges
即可。问题是Segments
被称为List<T>
、where T : IntSegment
,而inEdges
是List<IntSegment>
。(由于某些原因,除非你提出要求,否则我不会在这里讨论,这样的分配是不允许的。如果你感兴趣,请查找方差/协方差/反方差。)
一个经典问题。List<Derived>
不能隐式转换为List<Base>
。
您可以在List<Derived>
中投射项目,并创建一个List<Base>
,如下所示:
listOfBase = listOfDerived.Cast<Base>().ToList();
List<T>
不等价于List<TBase>
,其中T : TBase
。
为什么?因为List<T>
不是从List<TBase>
继承,所以只有泛型类型参数是相关的。
您可以在构造函数中执行此操作:
Segments = inEdges.Cast<Segment>().ToList()
我还将构造函数参数更改为IEnumerable<IntSegment>
同样,@Tim S.可能会根据你想要实现的目标找到最佳解决方案。就我个人而言,我相信他可能已经搞定了