Possible Duplicate:
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;
}
在第二种情况下,什么会阻止代码编译?为什么编译器无法弄清楚这种转换是安全的?
最佳答案
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