首页 >后端开发 >C++ >为什么我不能将列表分配给C#中的列表?

为什么我不能将列表分配给C#中的列表?

Susan Sarandon
Susan Sarandon原创
2025-02-01 17:51:12764浏览

Why Can't I Assign a List to a List in C#?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn