无法将源类型转换为目标类型编译错误
我有这个简单的课程
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类默认是不变的。