无法将源类型转换为目标类型编译错误

我有这个简单的课程

public class Program { private static void Main(string[] args) { ClassB objA = new ClassB(); ClassB<ITestA> objB = new ClassB(); } } public class ClassB { ///some code here } public interface ITestA { ///some code here } public class MyDTO { ///some code here } public class ClassA : ITestA { ///some code } 

这行代码

 ClassB<ITestA> objB = new ClassB(); 

正在给出编译错误

 Cannot implicitly convert type 'ClassB' to 'ClassB<ITestA> 

由于ClassA实现了ITestA,我不知道为什么会出现编译错误。 请帮我理解我做错了什么。

谢谢,Esen

这是由于generics的一个相当复杂的特征,称为方差 。

类是不变的,这意味着如果声明ClassB ,那么在创建实例时:

 ClassB obj = new ClassB 

然后T1必须与T2完全相同。

您可以使用接口来解决此问题,例如将代码更改为以下内容并进行编译:

 ... public class Program { private static void Main(string[] args) { ClassB objA = new ClassB(); IClassB> objB = new ClassB(); } } public interface IClassB // <- note the out before T { //some code here } public class ClassB : IClassB { //some code here } ... 

在这种情况下, IClassB被声明为协变,这意味着它可以处理被赋予T的派生类,而不是需要T本身。 然而,使用协方差(和逆变)存在风险,这就是为什么generics类默认是不变的。