class B : A {}
class Sub<T> where T:A
{
//...
}
Run Code Online (Sandbox Code Playgroud)
我想将Sub实例存储在集合中.
var c = new List<Sub<A>>();
c.Add(new Sub<B>()); //doesn't work
Run Code Online (Sandbox Code Playgroud)
但是,为了让它真正起作用,我必须声明一个接口并存储该接口的实例.
interface IBase
{
void DoStuff(A a);
}
var c = new List<IBase>();
c.Add(new Sub<B>()); //works
Run Code Online (Sandbox Code Playgroud)
有更优雅的方式吗?
不可以.具有不同类型参数的泛型类型的实例化完全不相关.您可以在同一个列表中获取它们的唯一方法是使列表使用通用的非泛型基类或接口,就像您在此处所做的那样.
您可以使用协变通用接口实现所需的近似值:
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.
}
Run Code Online (Sandbox Code Playgroud)
可以使用如下:
List<ISub<A>> list = new List<ISub<A>>();
list.Add(new Sub<B>());
Run Code Online (Sandbox Code Playgroud)
您需要一个接口,因为只有接口可以具有协变或逆变类型参数.