【发布时间】:2019-04-17 08:23:01
【问题描述】:
我有如下界面
public interface IInterface
{
int GetId();
}
ClassA 是一个泛型类,但 T 应该实现 IInterface
public class ClassA<T> where T : IInterface {
}
ClassB 实现 IInterface
public class ClassB : IInterface {
public int GetId() {
return 1;
}
}
ClassC 是我的问题所在,即将项目添加到列表中。
public class ClassC {
List<ClassA<IInterface>> list = new List<ClassA<IInterface>>();
public void Add<T>(ClassA<T> item) where T : IInterface {
list.Add(item);
}
}
上面的代码给出了以下有意义的错误
cannot convert from 'Program.ClassA<T>' to'Program.ClassA<Program.IInterface>'
问题的核心在于 Add() 方法,我的目标是能够添加任何类型的 ClassA。我不确定如何设计它以实现以下目标
ClassC classC = new ClassC();
ClassA<ClassB> classA = new ClassA<ClassB>();
classC.Add(classA);
有什么想法吗?
【问题讨论】:
-
嗨@user3170354。为什么
Add()方法是通用的?列表本身被定义为使用IInterface。所以我认为把它做成public void Add(ClassA<IInterface> item)会省钱。也许这行得通? -
泛型和继承/接口往往不能很好地混合。仅仅因为
A实现或继承自B,这并不使G<A>与G<B>具有相同的关系。在某些情况下,协方差和反方差会有所帮助,但这看起来不是其中之一。