【发布时间】:2011-07-10 00:02:09
【问题描述】:
public class A {}
public class B : A {}
现在让这个工作的最佳方法是什么
List<A> a;
List<B> b = new List<B>();
a = b; // throw Cannot convert List<B> to List<A>
谢谢
【问题讨论】:
标签: c# generics inheritance polymorphism
public class A {}
public class B : A {}
现在让这个工作的最佳方法是什么
List<A> a;
List<B> b = new List<B>();
a = b; // throw Cannot convert List<B> to List<A>
谢谢
【问题讨论】:
标签: c# generics inheritance polymorphism
List<T> 类型不支持协方差,因此您不能将List<B> 直接分配给List<A>,即使B 本身可以直接分配给A。您需要通过列表b,将项目转换并添加到列表a 中。 ConvertAll 方法是一种方便的方法:
List<B> b = new List<B>();
// ...
List<A> a = b.ConvertAll(x => (A)x);
【讨论】:
ConvertAll 是List<T> 类的实例方法,并从现有列表中创建一个新的List<T>。 Select 是一种扩展方法,作用于任何IEnumerable<T> 并创建一个新的IEnumerable<T> 序列。使用ConvertAll 应该比Select 快略,因为它可以进行一些优化(例如,它可以在一开始就将目标数组分配到正确的长度,而不是需要调整大小。 -fly,它可以直接访问源列表的底层数组,而不需要实例化和使用单独的枚举器对象)。