这是我的第一个问题,对不起,

我试图声明一个从同一类的继承创建的对象,但它告诉我不能强制继承该对象

abstract class BaseEntity{...}

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

class DummyEntity : BaseEntity {...}

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



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

BaseController<BaseEntity> a = new DummyController();

最佳答案

你不能这样做。这与covariance有关。

假设BaseController<T>具有方法Add(T entity)

现在,您创建DummyController的实例。您可以在此实例上调用Add(CowEntity entity),因为DummyController继承了BaseController<CowEntity>,因此TCowEntity

现在,如果您能够将其分配给BaseController<BaseEntity>,您将突然能够调用Add(BaseEntity entity)(因为T现在是BaseEntity,而不是CowEntity)。
这意味着您可以将ChickenEntity的实例(与CowEntity无关,它只是BaseEntity的另一个派生类)添加到该基本控制器(实际上是BaseController<CowEntity>的实例)。现在突然BaseController<CowEntity>的一个实例包含一个ChickenEntity。您会发现这没有任何意义。

要解决此问题,您需要阅读有关interfacescovariance (and contravariance)的信息。

希望这可以帮助 :)

关于c# - C#继承模板和等级,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57936637/

10-12 04:25