2011-03-06 100 views
2
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> 

谢谢

+0

参见:http://stackoverflow.com/questions/2184551/difference-between-covariance-contra-variance – 2011-03-06 23:01:33

回答

5

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); 
+0

什么ConvertAll的行为差异(X = >(A)x)和Select(x =>(A)x)? – Proviste 2011-03-07 10:08:50

+1

'ConvertAll'是'List '类中的一个实例方法,并从现有列表创建一个新的'List '。 'Select'是一种扩展方法,它作用于任何“IEnumerable ”,并创建一个新的“IEnumerable ”序列。使用'ConvertAll'应该比* Select稍快*,因为它可以进行一些优化(例如,它可以在开始时将目标数组分配到正确的长度,而不需要动态调整大小,而且它可以直接访问源列表的底层数组,而不需要实例化和使用单独的枚举器对象)。 – LukeH 2011-03-07 10:18:39