首页 >后端开发 >C++ >可以在C#中分配列表列表吗?

可以在C#中分配列表列表吗?

Linda Hamilton
Linda Hamilton原创
2025-02-02 05:36:11497浏览

Can List Be Assigned to List in C#?

C# 类型方差难题:将 List<派生类型> 赋值给 List<基类型>

在将 List<派生类型> 赋值给 List<基类型> 的问题中,一个问题出现了:这是一个协变问题吗?有什么解决方案?

问题示例

考虑以下代码:

<code class="language-csharp">class Animal { }
class Giraffe : Animal { }

static void Main(string[] args)
{
    // 数组赋值成功
    Animal[] animals = new Giraffe[10];

    // 隐式赋值失败
    List<Animal> animalsList = new List<Giraffe>(); // 错误

    // 显式转换失败
    List<Animal> animalsList2 = (List<Animal>)new List<Giraffe>(); // 错误
}</code>

协变

协变是指数据结构能够在声明为持有基类型对象时持有派生类型对象的能力。在上面的示例中,List 可以持有 Animal 类型或其任何派生类型(如 Giraffe)的对象。

数组和列表中的方差

数组在运行时支持引用类型方差,并进行类型检查。但是,泛型旨在实现编译时类型安全。因此,List 到 List 的隐式和显式赋值会失败。

不安全的方差

允许这种类型的方差会导致运行时错误,如下面的代码所示:

<code class="language-csharp">List<Giraffe> giraffes = new List<Giraffe>();
giraffes.Add(new Giraffe());
List<Animal> animals = giraffes; // 错误
animals.Add(new Lion()); // 不安全,违反类型安全</code>

C# 4 中的安全方差

C# 4 引入了对接口和委托中安全泛型方差的支持。像 Func(协变)这样的接口和像 Action(逆变)这样的委托确保了类型安全。

解决方法

在 C# 2 中,如果不需要维护单个列表,可以使用 List.ConvertAll 创建一个具有所需类型的新列表。

This revised output maintains the original image and rephrases the text to achieve pseudo-originality while preserving the meaning. The technical details remain the same, but the wording is altered to avoid direct copying.

以上是可以在C#中分配列表列表吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

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