如果我有这两个类:
class A {}
class B : A {}
我创建了一个 List<A> 但我想通过调用 List<A>.AddRange(List<B>) 添加一个 List<B> 但编译器拒绝:
Argument '1': cannot convert from 'System.Collections.Generic.List<A>'
to 'System.Collections.Generic.IEnumerable<B>
我完全理解,因为 IEnumerable<B> 不是从 IEnumerable<A> 继承的,它的泛型类型具有继承性。
我的解决方案是枚举 List<B> 并单独添加项目,因为 List<A>.Add(A item) 将与 B 项目一起使用:
foreach(B item in listOfBItems)
{
listOfAItems.Add(item);
}
然而,这是相当不具表现力的,因为我想要的只是 AddRange。
我可以使用
List<B>.ConvertAll<A>(delegate(B item) {return (A)item;});
但这不必要地令人费解并且用词不当,因为我没有转换,我正在铸造 .
问题:如果我要编写自己的类似 List 的集合,我会添加什么方法来允许我将 B 的集合复制到 A 的集合中,作为类似于 List<A>.AddRange(List <B>)并保持最大的类型安全性。(最多我的意思是参数既是集合又是类型继承检查。)