C# 在C中转换通用接口和类#

C# 在C中转换通用接口和类#,c#,.net,.net-4.0,casting,C#,.net,.net 4.0,Casting,可能重复: 为什么代码在第一种情况下编译,而在第二种情况下不编译 class ClassA { } class ClassB : ClassA { } static void Main() { var classAList = new List<ClassA>(); var classBList = new List<ClassB>(); IEnumerable<ClassA> classAIEnumerable; IE

可能重复:

为什么代码在第一种情况下编译,而在第二种情况下不编译

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;
}
A类{
}
B类:A类{
}
静态void Main(){
var classAList=新列表();
var classBList=新列表();
IEnumerable类可枚举;
IEnumerable classBIEnumerable=新列表();
//第一种情况:
classAIEnumerable=classBIEnumerable;
//第二种情况:
classAList=classBList;
}
在第二种情况下,什么会阻止代码编译?为什么编译器不能确定此强制转换是安全的?

列表
不是共变的,因为它不像
IEnumerable
那样将t定义为
输出
类型。它也不是相反的,因为它没有在中将T定义为一个

如果允许该类型转换,则可以向其添加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