c# 泛型列表子类型操作不起作用

c# generic list subtype operations not working

我有一个子类型列表:

public class LDBList<T> : List<T> 
    where T : LDBRootClass { ...

我需要连接它们

LDBList<TSHeaderItem> catted = tsh1.Concat2(tsh2);

(并且TSHeaderItem确实是LDBRootClass的子类型)

我明白了

Error CS0266 Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<LDB.TSHeaderItem>' to 'LDB.LDBList<LDB.TSHeaderItem>'. An explicit conversion exists (are you missing a cast?)

所提供的转换只是将错误从编译时推送到运行时。

现在我可以看到发生了什么,好的,但我不知道如何修复它。所以

  1. 我在这里具体做什么,

  2. 更重要的是,我显然对 c# 泛型了解不够,因此无法获得有关如何解决 这些 class 问题的基础知识,我从哪里开始阅读?

谢谢!

忽略它 几乎 永远不希望从 List<T> 继承的事实,您可以创建一个复制构造函数:

public class LDBList<T> : List<T> where T : LDBRootClass
{
    public LDBList(IEnumerable<T> collection) : base(collection) { }
}

哪个可以让你这样做:

var catted = new LDBList<TSHeaderItem>(tsh1.Concat2(tsh2));

关于你的第二个问题,这确实与泛型无关,但与一般类型系统有关。

tsh1.Concat2(tsh2) returns IEnumerable<TSHeaderItem>,而不是 LDBList<TSHeaderItem>,因此您需要做一些事情将 IEnumerable<TSHeaderItem> 转换为 LDBList<TSHeaderItem>

虽然 LDBList<TSHeaderItem> 实现了 IEnumerable<TSHeaderItem>,但并非所有 IEnumerable<TSHeaderItem> 都是 LDBList<TSHeaderItem>,实际上在这种情况下 tsh1.Concat2(tsh2) 的运行时类型将是ConcatIterator<TSHeaderItem>.