C# 中派生类列表转换为基类列表的问题
面向对象编程中,派生类继承基类是很常见的。然而,在处理集合(如列表)时,为什么不能简单地使用相同的基类声明它们,可能会令人困惑。
考虑以下代码:
<code class="language-csharp">interface A { } class B : A { } class C : B { } class Test { static void Main(string[] args) { A a = new C(); // 正确 List<A> listOfA = new List<C>(); // 编译错误 } }</code>
这段代码在尝试使用 List<C>
声明 List<A>
时会导致编译错误。虽然可以将派生类 C 的实例赋值给基类变量 a,但集合却不行。
这种限制的原因在于 C# 初始化列表的方式。创建 List<A>
时,C# 运行时会生成列表的内部数据结构,预期存储类型为 A 的对象。然而,由于 C 是 A 的派生类,其对象具有额外的成员,占用比 A 对象更多的内存。因此,将 List<C>
赋值给 List<A>
会导致内存地址错位,可能导致内存错误。
为了解决这个问题并转换 List<派生类>
为 List<基类>
,可以使用以下方法:
1. 显式转换:
遍历列表并显式地将每个元素转换为基类:
<code class="language-csharp">List<A> listOfA = new List<C>().ConvertAll(x => (A)x);</code>
2. LINQ:
使用 LINQ 将元素转换如下:
<code class="language-csharp">List<A> listOfA = new List<C>().Cast<A>().ToList();</code>
这些方法允许安全转换和内存地址对齐,确保列表的正常运行。
以上是为什么我不能将列表分配给C#中的列表?的详细内容。更多信息请关注PHP中文网其他相关文章!