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

时间:2015-06-30 21:05:30

标签: c# generics type-conversion

我有这个简单的课程

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,我不知道为什么会出现编译错误。请帮我理解我做错了什么。

谢谢, 也先

1 个答案:

答案 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本身。然而,使用协方差(和逆变)存在风险,这就是为什么泛型类默认是不变的。