首页 > 解决方案 > C#继承模板和种姓

问题描述

这是我的第一个问题,请原谅我的无能,

我试图声明一个从同一个类的继承中创建的对象,但它告诉我我不能转换被继承的对象

abstract class BaseEntity{...}

abstract class BaseController<T> where T : Model.BaseEntity{...}

class DummyEntity : BaseEntity {...}

class DummyController : BaseController<DummyEntity> {...}

当我想创建一个对象时,它表明它不能被隐式转换。

BaseController<BaseEntity> a = new DummyController();

标签: c#templatesinheritancepolymorphism

解决方案


你不能这样做。这与协方差有关。

想象一下BaseController<T>有一个方法Add(T entity)

现在您创建一个DummyController. 你可以调用Add(CowEntity entity)这个实例,因为DummyController继承BaseController<CowEntity>了。 TCowEntity

现在,如果您能够将其分配给您,BaseController<BaseEntity>您将突然可以调用Add(BaseEntity entity)(因为 T 是 now BaseEntityCowEntity不再是)。
这意味着您可以将ChickenEntity(与 无关CowEntity,它只是 的另一个派生类BaseEntity)的实例添加到实际上是BaseController<CowEntity>. 现在突然一个实例BaseController<CowEntity>包含一个ChickenEntity. 你看这没有意义。

要解决这个问题,您需要阅读有关接口协变(和逆变)的信息。

希望这可以帮助 :)


推荐阅读