如果我有这两个类:
class A {}
class B : A {}
我制作了一个 List 但我想通过调用 List.AddRange(List) 添加一个 List 但编译器拒绝:
Argument '1': cannot convert from 'System.Collections.Generic.List<A>'
to 'System.Collections.Generic.IEnumerable<B>
这个我完全理解,因为IEnumerable没有继承自IEnumerable,它的泛型有继承。
我的解决方案是枚举 List 并单独添加项目,因为 List.Add(A item) 将与 B 项目一起使用:
foreach(B item in listOfBItems)
{
listOfAItems.Add(item);
}
但是,这相当缺乏表达力,因为我想要的只是 AddRange。
我可以用
List<B>.ConvertAll<A>(delegate(B item) {return (A)item;});
但这是不必要的复杂和用词不当,因为我不是在转换,而是在转换。
问题:如果我要编写自己的类列表集合,我应该向其中添加什么方法,以允许我将 B 的集合作为单行复制到 A 的集合中类似于 List.AddRange(List) and 保留最大类型安全。 (我最大的意思是该参数既是集合又是类型继承检查。)
请您参考如下方法:
的确,泛型现在不是变体。在 C# 4.0 中,IEnumerable <B > 将转换为 IEnumerable <A > 如果 B 可以通过引用转换转换为 A。有关此功能设计的一些详细信息,请参阅:
http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx
