c# - C#继承模板和种姓
问题描述
这是我的第一个问题,请原谅我的无能,
我试图声明一个从同一个类的继承中创建的对象,但它告诉我我不能转换被继承的对象
abstract class BaseEntity{...}
abstract class BaseController<T> where T : Model.BaseEntity{...}
class DummyEntity : BaseEntity {...}
class DummyController : BaseController<DummyEntity> {...}
当我想创建一个对象时,它表明它不能被隐式转换。
BaseController<BaseEntity> a = new DummyController();
解决方案
你不能这样做。这与协方差有关。
想象一下BaseController<T>
有一个方法Add(T entity)
。
现在您创建一个DummyController
. 你可以调用Add(CowEntity entity)
这个实例,因为DummyController
继承BaseController<CowEntity>
了。 T
CowEntity
现在,如果您能够将其分配给您,BaseController<BaseEntity>
您将突然可以调用Add(BaseEntity entity)
(因为 T 是 now BaseEntity
,CowEntity
不再是)。
这意味着您可以将ChickenEntity
(与 无关CowEntity
,它只是 的另一个派生类BaseEntity
)的实例添加到实际上是BaseController<CowEntity>
. 现在突然一个实例BaseController<CowEntity>
包含一个ChickenEntity
. 你看这没有意义。
希望这可以帮助 :)
推荐阅读
- c# - 如何在 ASP.Net Api 中搜索所有字段
- angular - Angular 应用程序在本地使用 IE11,但在 IIS 上托管时不使用
- javascript - 无法接收从客户端 1 发送到服务器并返回到客户端 2 的套接字数据
- javascript - 在 Azure 上提供 React App 时出现 ENOENT 错误
- javascript - 需要从 GAS Web 应用程序上的先前条目中检索特定数量的数据
- excel - 通过在 Excel VBA 中使用 ADO 对 Redshift 使用多行插入来提高性能
- excel - 删除除包含 X 值的列之外的所有列
- flutter - 如何通过添加 if-else 语句动态更改结果文本的颜色?目前我无法在文本小部件中添加 if-else
- .htaccess - 重写网址,并非所有网址都有效
- vba - 数据透视图“For Each”功能