2012-03-16 86 views
3

可能重复:
Question about C# covariance铸造通用接口和类在C#

为什么代码编译在第一种情况下,但在第二个没有编制?

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

在第二种情况下阻止代码编译的是什么?为什么编译器不知道这个投射是安全的?

回答

4

List<T>不是共变的,因为它不像IEnumerable<out T>那样将T定义为out类型。它也没有反转,因为它没有将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