我正在尝试将A的列表传递DerivedClass给采用的列表的函数BaseClass,但出现错误:
DerivedClass
BaseClass
cannot convert from 'System.Collections.Generic.List<ConsoleApplication1.DerivedClass>' to 'System.Collections.Generic.List<ConsoleApplication1.BaseClass>'
现在,我可以将其强制List<DerivedClass>转换为List<BaseClass>,但是这样做不舒服,除非我理解为什么编译器不允许这样做。
List<DerivedClass>
List<BaseClass>
我发现的解释只是说它某种程度上违反了类型安全性,但我没有看到它。谁能帮我吗?
编译器允许从List<DerivedClass>到转换的风险是什么List<BaseClass>?
这是我的SSCCE:
class Program { public static void Main() { BaseClass bc = new DerivedClass(); // works fine List<BaseClass> bcl = new List<DerivedClass>(); // this line has an error doSomething(new List<DerivedClass>()); // this line has an error } public void doSomething(List<BaseClass> bc) { // do something with bc } } class BaseClass { } class DerivedClass : BaseClass { }
这是因为List<T>is in-variant而不是co-variant,所以您应该更改为IEnumerable<T>support co-variant,它应该起作用:
List<T>
in-variant
co-variant
IEnumerable<T>
IEnumerable<BaseClass> bcl = new List<DerivedClass>(); public void doSomething(IEnumerable<BaseClass> bc) { // do something with bc }
有关泛型协变量的信息