class B : A {} class Sub<T> where T:A { //... }
我想将子实例存储在集合中.
var c = new List<Sub<A>>(); c.Add(new Sub<B>()); //doesn't work
但是要让它实际工作,我必须声明一个接口并存储该接口的实例.
interface IBase { void DoStuff(A a); } var c = new List<IBase>(); c.Add(new Sub<B>()); //works
有更优雅的做法吗?
解决方法
不同类型参数的通用类型的实例化是完全无关的.您可以将它们列入同一个列表中的唯一方法是让列表使用一个常见的非泛型基类或接口,就像您在这里一样.
您可以通过使用协变通用界面来实现所需的近似:
class A { } class B : A { } interface ISub<out T> where T : A { // Members go here } class Sub<T> : ISub<T> where T : A { // Members go here. }
其中可以使用如下:
List<ISub<A>> list = new List<ISub<A>>(); list.Add(new Sub<B>());
您需要一个接口,因为只有接口可以具有协变或逆变类型参数.