c# – 泛型和铸造

前端之家收集整理的这篇文章主要介绍了c# – 泛型和铸造前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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>());

您需要一个接口,因为只有接口可以具有协变或逆变类型参数.

猜你在找的C#相关文章