【发布时间】:2019-09-14 14:55:34
【问题描述】:
这是我的第一个问题,请原谅我的无能,
我试图声明一个从同一个类的继承中创建的对象,但它告诉我我不能转换被继承的对象
abstract class BaseEntity{...}
abstract class BaseController<T> where T : Model.BaseEntity{...}
class DummyEntity : BaseEntity {...}
class DummyController : BaseController<DummyEntity> {...}
当我要创建一个对象时,表示不能隐式转换。
BaseController<BaseEntity> a = new DummyController();
【问题讨论】:
-
什么是
CowEntity?我猜这是BaseEntity的派生类吧? -
对不起我的错。
-
您的
DummyController继承自BaseController<CowEntity>,而不是BaseController<BaseEntity>。即使CowEntity(你没有显示它的定义)继承自BaseEntity(我猜这是你的意图),你仍然会得到错误 -
你想要的是协方差,它在类中不可用。如果您创建一个像
IBaseController<out T> where T : BaseEntity这样的接口,那么您可以将IBaseController<DummyEntity>转换为IBaseController<BaseEntity>,但请注意,您只能在T来自接口中定义的方法或者是只读属性的类型时才能执行此操作, 它不能是方法的参数或可写属性的类型。 -
@juharr 确实。见my answer。我认为这里不值得解释协方差和反方差,因为那里有很多资源可以比我做得更好:)
标签: c# templates inheritance polymorphism