微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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>());

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

原文地址:https://www.jb51.cc/csharp/97248.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐