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
但是,这种赋值会引发安全问题。如果将新的狮子对象添加到animalsList中,则可以将其分配给animalsList2,而没有任何编译时检查,即使这违反了动物列表的类型安全。
C#中的解决方案
使用数组进行运行时检查: 数组支持运行时引用类型方差,允许将派生类型数组赋值给基类型数组。
C# 4中的安全方差:
C# 4引入了对接口和委托的安全方差支持。Func
C# 2中的变通方法:
在C# 2中,可以使用List
结论
C#方差问题突出了在泛型赋值期间保持类型安全的重要性。虽然可以使用数组或运行时检查来实现不安全方差,但使用接口和委托的安全方差可确保编译时类型正确性。对于早期版本的C#,可以使用List
以上是为什么我不能在C#中分配列表?的详细内容。更多信息请关注PHP中文网其他相关文章!