如何在 C# 的泛型中使用扩展

Posted

技术标签:

【中文标题】如何在 C# 的泛型中使用扩展【英文标题】:How to use extends in generic for C# 【发布时间】:2016-01-03 19:46:27 【问题描述】:

我是C# 的新手,如何在C# 中使用下面的泛型,我想要C# 中的Java 语句,

List<? extends MySuperClass> list= new ArrayList<MySubClass>();

Java 允许以上,我们可以在C# 中实现相同的功能吗?

【问题讨论】:

在 C# 中称为泛型约束。 相关:***.com/q/32664/1065197***.com/q/588643/1065197 这不是在 Java 中使用泛型的好例子。 【参考方案1】:

C# 没有通配符。所以简单的答案是否定的,没有直接的等价物。

但是,我认为用 Java 编写那行代码没有多大意义,因为您正在丢弃类型信息。你也可以写

List<MySubClass> list = new ArrayList<MySubClass>();

在 Java 中使用通配符的主要原因是让方法参数尽可能通用,如下所示:

static void foo(List<? extends MySuperClass> list)

你可以像这样用 C# 做到这一点:

static void foo<T>(IList<T> list) where T : MySuperClass 

【讨论】:

我怎样才能将它与下面的变量一起使用public AbstractIBaseBo&lt;? extends AbstractDomain&gt; abstractIBaseBo =null; @AnchitPancholi 我觉得这个设计很奇怪。你应该避免声明这样的字段。 @AnchitPancholi 我不认为你可以。我可能错了,因为我对 C# 不像对 Java 那样熟悉。我想你可以有一个AbstractIBaseBo&lt;AbstractDomain&gt;。我还认为您可以在具有类型参数T 其中T : AbstractDomain 的泛型类中拥有AbstractIBaseBo&lt;T&gt; 类型的字段。 我会尝试找出其他可能的解决方案,否则我很可能需要更改我的设计。

以上是关于如何在 C# 的泛型中使用扩展的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 泛型中的 in 和 out

使用 psalm 扩展接口的泛型

java泛型中的下限

为啥在 Typescript 泛型中使用 '&'

如何接受在 Scala 中扩展类的泛型

泛型编程的术语