c# – 泛型和铸造

c# – 泛型和铸造,第1张

概述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);}
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# – 泛型和铸造全部内容,希望文章能够帮你解决c# – 泛型和铸造所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1238686.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存