我有这个简单的课程
public class Program
{
private static void Main(string[] args)
{
ClassB<ClassA> objA = new ClassB<ClassA>();
ClassB<ITestA<MyDTO>> objB = new ClassB<ClassA>();
}
}
public class ClassB<T>
{
///some code here
}
public interface ITestA<T>
{
///some code here
}
public class MyDTO
{
///some code here
}
public class ClassA : ITestA<MyDTO>
{
///some code
}
这行代码
ClassB<ITestA<MyDTO>> objB = new ClassB<ClassA>();
正在提供编译错误
Cannot implicitly convert type 'ClassB<ClassA>' to 'ClassB<ITestA<MyDTO>>
由于ClassA实现了ITestA,我不知道为什么会出现编译错误。请帮我理解我做错了什么。
谢谢, 也先
答案 0 :(得分:3)
这是由于泛型的相当复杂的特征称为variance。
类是不变的,这意味着如果您声明{"key":"key1","value":"value1"}
{"key":"key2","value":"value2"}
{"key":"key1","value":"value3"}
,那么在创建实例时:
{key:"key1","value":[value1,value3]}
{key:"key2","value":value2}
然后ClassB<T>
必须与ClassB<T1> obj = new ClassB<T2>
完全相同。
您可以使用接口来解决此问题,例如将代码更改为以下内容并编译:
T1
在这种情况下,T2
被声明为协变,这意味着它可以处理被赋予...
public class Program
{
private static void Main(string[] args)
{
ClassB<ClassA> objA = new ClassB<ClassA>();
IClassB<ITestA<MyDTO>> objB = new ClassB<ClassA>();
}
}
public interface IClassB<out T> // <- note the out before T
{
//some code here
}
public class ClassB<T> : IClassB<T>
{
//some code here
}
...
的派生类,而不是需要IClassB
本身。然而,使用协方差(和逆变)存在风险,这就是为什么泛型类默认是不变的。