【问题标题】:generic types polymorphism泛型类型多态性
【发布时间】: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


【解决方案1】:

List&lt;T&gt; 类型不支持协方差,因此您不能将List&lt;B&gt; 直接分配给List&lt;A&gt;,即使B 本身可以直接分配给A。您需要通过列表b,将项目转换并添加到列表a 中。 ConvertAll 方法是一种方便的方法:

List<B> b = new List<B>();
// ...
List<A> a = b.ConvertAll(x => (A)x);

【讨论】:

  • ConvertAll(x => (A)x) 和 Select(x => (A)x) 之间的行为区别是什么?
  • ConvertAllList&lt;T&gt; 类的实例方法,并从现有列表中创建一个新的List&lt;T&gt;Select 是一种扩展方法,作用于任何IEnumerable&lt;T&gt; 并创建一个新的IEnumerable&lt;T&gt; 序列。使用ConvertAll 应该比Select,因为它可以进行一些优化(例如,它可以在一开始就将目标数组分配到正确的长度,而不是需要调整大小。 -fly,它可以直接访问源列表的底层数组,而不需要实例化和使用单独的枚举器对象)。
猜你喜欢
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 2014-06-01
  • 1970-01-01
相关资源
最近更新 更多