Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么要列出<;T2>;不是列表的子类型<;T1>;如果T2是.NET中T1的一个子类型?_C#_.net_Generics_Inheritance - Fatal编程技术网

C# 为什么要列出<;T2>;不是列表的子类型<;T1>;如果T2是.NET中T1的一个子类型?

C# 为什么要列出<;T2>;不是列表的子类型<;T1>;如果T2是.NET中T1的一个子类型?,c#,.net,generics,inheritance,C#,.net,Generics,Inheritance,如果T2是T1的子类型,为什么List不是List的子类型? 这种行为背后的限制是什么 解决该限制的更好方法是什么?因为这样可以将T2列表强制转换为T1列表,放松插入条件,然后将T1对象插入到运行时类型仅接受T2的列表中 要解决这个问题,您可以使用Cast().ToList()创建一个新列表狗的列表不是动物的列表。如果这是真的,你可以做 List<Animal> list = new List<Dog>(); list.Add(new Cat()); List List

如果
T2
T1
的子类型,为什么
List
不是
List
的子类型? 这种行为背后的限制是什么


解决该限制的更好方法是什么?

因为这样可以将T2列表强制转换为T1列表,放松插入条件,然后将T1对象插入到运行时类型仅接受T2的列表中


要解决这个问题,您可以使用
Cast().ToList()
创建一个新列表狗的列表不是动物的列表。如果这是真的,你可以做

List<Animal> list = new List<Dog>();
list.Add(new Cat());
List List=新列表();
添加(新的Cat());

但是在狗的列表中添加猫是无效的。你应该阅读有关协方差和逆变换的文章。

什么仅仅是因为你在谈论
列表,而不是
T1
T2
。您可以使列表可转换,通过自己的类包装它们,并在泛型中定义强制转换操作

协方差和逆变:另请参见,如果希望方法支持协方差,则可以使用IEnumerable。