为什么代码在第一种情况下编译,但在第二种情况下不编译?
class ClassA {
}
class ClassB : ClassA {
}
static void Main() {
var classAList = new List<ClassA>();
var classBList = new List<ClassB>();
IEnumerable<ClassA> classAIEnumerable;
IEnumerable<ClassB> classBIEnumerable = new List<ClassB>();
// First case:
classAIEnumerable = classBIEnumerable;
// Second case:
classAList = classBList;
}
在第二种情况下阻止代码编译的是什么?为什么编译器无法确定这个转换是否安全?
答案 0 :(得分:4)
List<T>
不是协变的,因为与out
不同,它不会将T定义为IEnumerable<out T>
类型。它也不是逆向的,因为它没有将T定义为in
。
如果允许那个演员表,那么你可以为它添加一个C类:
class ClassC : ClassA {
}
// Second case:
classAList = classBList; //suppose this is allowed
ClassA myC = new ClassC();
classAList.Add(myC); //Whoops! we've added a ClassC to the list which is actually a list of ClassBs