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?)
所提供的转换只是将错误从编译时推送到运行时。
现在我可以看到发生了什么,好的,但我不知道如何修复它。所以
我在这里具体做什么,
更重要的是,我显然对 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>
.
我有一个子类型列表:
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?)
所提供的转换只是将错误从编译时推送到运行时。
现在我可以看到发生了什么,好的,但我不知道如何修复它。所以
我在这里具体做什么,
更重要的是,我显然对 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>
.