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

为什么我不能在C#中分配列表?

Mary-Kate Olsen
发布: 2025-02-02 05:16:09
原创
253 人浏览过

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

C# 泛型差异问题:将List<派生类>赋值给List<基类>

在C#中使用泛型列表时,尝试将派生类型的列表赋值给基类型的列表可能会遇到方差问题。此问题是运行时类型安全性和编译时类型安全之间冲突造成的。

问题和代码示例

考虑以下代码:

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>(); //编译错误
}
登录后复制

在此示例中,由于运行时检查,将长颈鹿数组赋值给动物数组是有效的。但是,将List赋值给List会导致编译时错误。

方差和安全问题

此问题与泛型中的方差概念有关。协变允许在基类型位置使用派生类型,而逆变允许在派生类型位置使用基类型。在上面的示例中,将List赋值给List将被视为协变。

但是,这种赋值会引发安全问题。如果将新的狮子对象添加到animalsList中,则可以将其分配给animalsList2,而没有任何编译时检查,即使这违反了动物列表的类型安全。

C#中的解决方案

使用数组进行运行时检查: 数组支持运行时引用类型方差,允许将派生类型数组赋值给基类型数组。

C# 4中的安全方差: C# 4引入了对接口和委托的安全方差支持。Func在T中是协变的,而Action在T中是逆变的。

C# 2中的变通方法: 在C# 2中,可以使用List.ConvertAll创建具有所需类型的新的列表。

结论

C#方差问题突出了在泛型赋值期间保持类型安全的重要性。虽然可以使用数组或运行时检查来实现不安全方差,但使用接口和委托的安全方差可确保编译时类型正确性。对于早期版本的C#,可以使用List.ConvertAll作为替代解决方案。

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

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