2

我有MyClass<T>一些T接口的类:

class MyClass<T> where T: IMyInterface

我编写了几个类,这些类MyClass使用 的一些实现进行扩展IMyInterface,例如:

class MySecondClass : MyClass<MyInterfaceImplementation>

为什么不允许MySecondClass将实例分配给具有类型的变量?MyClass<IMyInterface>

MyClass<IMyInterface> x = new MySecondClass()

当我添加隐式转换时:

public static implicit operator MyClass<IMyInterface>(MySecondClass c) {
    return c;
}

它开始工作。

4

3 回答 3

2

要执行您想要的操作,您应该使用关键字 声明类型参数T是协变的(请参阅 MSDN 上的泛型中的协变和逆变)。 您需要稍微修改代码,因为只能在接口上定义协变和逆变:out

interface IMyInterface { 
}

// note that this one is an interface now
interface IMyClass<out T> where T : IMyInterface { 
}

class MyInterfaceImplementation : IMyInterface { 
}

class MySecondClass : IMyClass<MyInterfaceImplementation> { 
}

class Program {
    static void Main(string[] args) {
        IMyClass<IMyInterface> x = new MySecondClass();
    }
}
于 2013-11-04T12:11:38.503 回答
1

MyClass<IMyInterface>并且MySecondClass两个不同的类和编译器不能将一种类型的对象隐式转换为另一种类型。

甚至更多这两个类只有System.Object共同的基类

于 2013-11-04T12:00:06.143 回答
0

这是因为泛型类(c++ 术语中的模板)的性质和设计。

例如:

MyClass<object> o = new MyClass<string>();

也将无法编译。泛型类不是彼此的后代,仅仅因为它们的泛型类型是。它们实际上是不同的类,在面向对象的意义上彼此没有关系。

于 2013-11-04T11:59:01.493 回答