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