通用超类和类型不匹配

时间:2015-02-19 01:20:35

标签: c# generics inheritance interface hierarchy

我有一个通用的基类:

public abstract BaseClass<T> where T: IMyModels {
     ...
}

一个子类:

public class MyFirstsubClass: BaseClass<MyFirstModel> {
     ...
}

这些是接口和模型:

public interface IMyModel {} // Empty Interface 

public MyFirstModel: IMyModel {
   // Some automatic properties
}

由于MyFirstClass扩展为BaseClass,其类型正在实现IMyModel接口,因此下面的代码必须正常,但visual studio显示&#34;不能隐式转换类型&#34;错误,当我进行显式转换时,它表示无法显式转换类型。

BaseClass<IMyModel> Temp = new MyFirstsubClass();

在这个结构中有什么好处,我怎么能修改它以便修复上面代码的问题?

1 个答案:

答案 0 :(得分:0)

  

由于MyFirstClass已扩展为BaseClass,其类型正在实施IMyModel接口,因此以下代码必须正常

不,BaseClass<MyFirstModel> 一个BaseClass<IMyModel>,因为默认情况下泛型类不是协变的。假设你有一个方法:

public void Process(T model)
{
    ...
}

对于BaseClass<MyFirstModel>,此方法编译为

public void Process(MyFirstModel model)
{
    ...
}

现在假设您可以将它投射到BaseClass<IMyModel>。然后将IMyModel的其他一些实现传递给Process是合法的,这种实现期望一个MyFirstModel并且可能会失败。

  

如何修改它以便修复上述代码的问题?

您唯一能做的就是将其声明为BaseClass<MyFirstModel>

BaseClass<MyFirstModel> Temp = new MyFirstsubClass();

不知道BaseClass<T>做了什么;不可能知道是否有合理的方式将其转换为BaseClass<IMyModel>