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

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

Susan Sarandon
发布: 2025-02-01 17:51:12
原创
707 人浏览过

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板