【发布时间】:2017-11-27 23:22:48
【问题描述】:
最近我开始学习泛型。我在存储对泛型类实例的引用时遇到了麻烦。如您所见,我的 ListHandler 类可以存储对特定类型 BaseClass 的引用。我很想自己注册 BaseClass 实例,这就是为什么我想通过添加“where”来保证他们将使用 BaseParamClass。无论如何 - 它不会编译。'This',即使在类中使用'where'关键字,也不知道 T 实际上是 BaseClassParam。我不知道这里出了什么问题,我在任何地方都找不到答案。我将不胜感激提示/指南/解决方案。
public class ListHandler
{
private List<BaseClass<BaseParamClass>> list;
public ListHandler()
{
list = new List<BaseClass<BaseParamClass>>();
}
public void Register(BaseClass<BaseParamClass> param)
{
list.Add(param);
}
}
public class BaseClass<T> where T : BaseParamClass
{
private ListHandler listHandler;
public T Param { get; private set; }
public BaseClass(ListHandler listHandler)
{
this.listHandler = listHandler;
listHandler.Register(this); //throws error
}
}
【问题讨论】:
-
Afaic 那是因为协方差只允许用于接口,检查这里:stackoverflow.com/questions/6508529/…
-
您还有一个与封闭类同名的方法
public void BaseClass。这也是不允许的。那是构造函数吗? -
您遇到的错误是什么?也没有人可以编译你的代码,因为没有人有
BaseParamClass,因为你没有在你的问题中包含这个。 -
除了其他 cmets,我不会使用
List<BaseClass<BaseParamClass>>调用世界上最简单的数据结构。我很想知道更多关于这段代码的高级用途,因为可能有另一种方法 - 即可能是封装和接口。 -
为什么
BaseClass<T>包含ListHandler,而其中包含BaseClass<>的列表?似乎相当递归没有一点,除非我错过了?
标签: c# generics collections