c# - 具有类继承和泛型类型继承的 C# 集合不允许添加继承的类
问题描述
我遇到了一些可能的事情,但不起作用。
这是示例类,
abstract class BaseModel { }
abstract class BaseViewModel<T> where T : BaseModel
{
protected T model;
}
class ModelA : BaseModel { }
class ViewModelA : BaseViewModel<ModelA> { }
现在我试着做
class Program
{
static void Main(string[] args)
{
var collection = new List<BaseViewModel<BaseModel>>();
collection.Add(new ViewModelA());
}
}
直觉上,它看起来是工作。但是无法添加ViewModelA
.
我想知道为什么这是不可能的,并解决这种情况。
解决方案
ViewModelA
不等于,BaseViewModel<BaseModel>
即使您可能认为它是
这是因为类是不变的。
不变性:意味着您只能使用最初指定的类型
Covariance:使您能够使用比最初指定的更多派生类型。
实现您想要的(可能)的一种方法是通过out generic modifier使用协变接口参数。但是,它有一定的局限性。类型参数只能作为接口方法的返回类型,不能作为方法参数的类型
例子
public interface IBaseViewModel<out T> where T : BaseModel
{
...
}
abstract class BaseViewModel<T> : IBaseViewModel<T> where T : BaseModel
{
protected T model;
}
class ModelA : BaseModel { }
class ViewModelA : BaseViewModel<ModelA> { }
static void Main(string[] args)
{
var collection = new List<IBaseViewModel<BaseModel>>();
collection.Add(new ViewModelA()); // this now works
}
推荐阅读
- dotnetnuke - DNN 9 SPA 模块快速设置
- javascript - how to make multiple api calls in one action (one button)
- elasticsearch - ElasticSearch 中的 batches 和 requests_per_second 按查询删除 API
- reactjs - 使用 D3 比较直方图进行颜色渐变
- redirect - nginx 反向代理和 pega
- node.js - 访问 dist 文件夹之外的上传文件 Angular 2 +
- go - golang模板双父上下文
- sql - 获取 Super 和 sub 类型的列表
- wordpress - WooCommerce PDF 发票和装箱单在中文中不起作用
- performance - 使用 Docker 对简单的 Go 服务器造成巨大的性能影响