【发布时间】:2020-09-08 06:00:02
【问题描述】:
我遇到了一些可能的事情,但不起作用。
这里是示例类,
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。
我想知道为什么这是不可能的,并解决这种情况。
【问题讨论】:
-
A
BaseViewModel<BaseModel>必须能够处理继承自BaseModel的任何内容。你传递给它一个ViewModelA,它只能处理从BaseModel继承的东西的子集,即从ModelA继承的对象。所以不允许赋值。 -
@JohnWu 那么有什么解决办法吗?
-
解决方法是:重新考虑您的设计。您的列表真的是基本类型还是所有实体都是派生类型?您使用该集合的 cinsuming 代码是什么?
-
想象一下这会成为可能。然后你的代码的用户也可以写
collection.Add(AnotherViewModel)。 -
@HimBromBeere 我试图允许
collection.Add(AnotherViewModel)具有继承BaseViewModel<T> where T : BaseModel的限制。我知道这可能是一个设计问题,但我很好奇为什么它不起作用。
标签: c# generics inheritance