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

时间:2012-03-16 09:28:43

标签: c# .net .net-4.0 casting

  

可能重复:
  Question about C# covariance

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

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;
}

在第二种情况下阻止代码编译的是什么?为什么编译器无法确定这个转换是否安全?

1 个答案:

答案 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

http://msdn.microsoft.com/en-us/library/ee207183.aspx