我有一个通用的基类:
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();
在这个结构中有什么好处,我怎么能修改它以便修复上面代码的问题?
答案 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>
。