【问题标题】:C#'s equivalent of Java's <? extends Base> in genericsC# 相当于 Java 的 <?在泛型中扩展 Base>
【发布时间】:2011-06-11 13:48:47
【问题描述】:

在 Java 中,我可以执行以下操作:(假设 Subclass 扩展 Base):

ArrayList<? extends Base> aList = new ArrayList<Subclass>();

C# .NET 中的等价物是什么?显然没有 ? extends 关键字,这不起作用:

List<Base> aList = new List<Subclass>();

【问题讨论】:

  • .net 中没有真正的等价物,感谢上帝
  • 您的示例显示了 java 中损坏的类型差异,.net 没有损坏的差异.. 好吧,除了一个地方。

标签: c# .net generics inheritance extends


【解决方案1】:

实际上有一个等价(某种),where 关键字。我不知道它有多“接近”。我有一个需要做类似事情的功能。

我找到了一个关于它的msdn page

我不知道你是否可以对变量进行内联处理,但对于类你可以这样做:
public class MyArray&lt;T&gt; where T: someBaseClass
或函数
public T getArrayList&lt;T&gt;(ArrayList&lt;T&gt; arr) where T: someBaseClass

我没有在页面上看到它,但使用 where 关键字可能是变量。

【讨论】:

  • 漂亮,几乎正是我想要的。谢谢!公共类 ImplementingClass : BaseClass where T : GenericBaseClass { ... }
  • 此响应实际上可以作为答案
  • 完成此任务的方式多么丑陋,但至少它完成了这项工作! +1
  • @Raystrom--你能回答this question与你的回答有关吗?
  • 这是另一个变体,除了 someBaseClass 之外,您的类还必须实现 IDisposable。公共类 MyArray : IDisposable where T: someBaseClass
【解决方案2】:

查看CovarianceContravariance.Net 4.0 一起引入。但它目前仅适用于 interfaces

示例:

IEnumerable<Base> list = new List<SubClass>();

【讨论】:

  • 只看这个帖子,试图理解泛型的C#方式。如果您的示例的静态类型是List&lt;Base&gt;,并且我想添加一个不是SubClass 的实例的Base 实现器,会发生什么?这会是运行时错误吗?
  • @decyclone--你能回答this question与你的回答有关吗?
【解决方案3】:

没有确切等价物(因为类型系统的工作方式并不完全相同,包括类型擦除等等),但您可以使用 in 和 @ 获得非常相似的功能987654324@ 使用covariance and contravariance

【讨论】:

  • @Mehrdad--你能回答this question与你的回答有关吗?
  • 我有这个问题已经好几天了,这是我第二次问这样的问题,不明白为什么人们不能回答这个问题
  • @Taufel:乍一看,至少它看起来像一个“XY 问题”。你实际上想做什么?你只是想构建一些东西吗?因为可能有一种方法不涉及完全匹配 Java 语义(这甚至可能是不可能的)。
  • 是的,我真的很想在有或没有完全匹配 Java 语义的情况下这样做,但最终结果(功能)最多应该相同
  • 这真的是一个很难回答的问题吗?顺便说一句,以前很少有人回答这个问题?希望您能在这方面有所帮助:)
【解决方案4】:

如果您正在寻找两种类型的泛型,请看一下:

    void putAll<K1, V1>(Dictionary<K1,V1> map) where K1 : K where V1 : V;

【讨论】:

  • @Guilheme--你能回答this question与你的回答有关吗?
猜你喜欢
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-29
  • 2012-06-13
相关资源
最近更新 更多