如何设置基成员泛型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<;T>;使用派生的特定列表<;TUser>;

List<IntSegment> inEdges更改为List<T> inEdges即可。问题是Segments被称为List<T>where T : IntSegment,而inEdgesList<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.可能会根据你想要实现的目标找到最佳解决方案。就我个人而言,我相信他可能已经搞定了