【问题标题】:Why do arrays in .net only implement IEnumerable and not IEnumerable<T>?为什么 .net 中的数组只实现 IEnumerable 而不是 IEnumerable<T>?
【发布时间】:2011-02-15 22:54:42
【问题描述】:

我正在实现自己的 ArrayList 类,当我意识到这一点时感到很惊讶

public System.Collections.Generic.IEnumerator<T> GetEnumerator() {
    return _array.GetEnumerator();
}

没用。数组没有在 .NET 中实现 IEnumerator 的原因是什么?

有什么解决办法吗?

谢谢

【问题讨论】:

  • 既然已有十几个集合类,为什么还要实现自己的 ArrayList 类?
  • 我为什么不呢?我厌倦了那些类型的 cmets。
  • 我们问这些问题不是为了惹恼您,而是要找出您想要做什么。这有助于我们为您提供更好的答案。
  • 是的,我正在实现一个 ArrayList,因为尽管所有语言都在其框架中提供了某种 ArrayList,但我认为 .NET 没有。谢谢大家清理它。
  • 这类问题很烦人,因为它们试图将谈话和答案从被问到的内容上转移开。我总是觉得最好回答被问到的问题,不管它“看起来”多么愚蠢。

标签: c# .net arrays ienumerable ienumerator


【解决方案1】:

数组确实实现了IEnumerable&lt;T&gt;,但它是作为 CLI 对数组的特殊知识的一部分完成的。这就像它是一个显式实现一样工作(但不是:它是在运行时完成的)。许多工具不会显示此实现,这在Array 类概述的Remarks 部分中进行了描述。

您可以添加演员表:

return ((IEnumerable<T>)_array).GetEnumerator();

注意,旧的 MSDN(docs.microsoft.com 之前)对此的报道随着不同的 .NET 版本发生了几次变化,请查看 remarks 部分。

【讨论】:

  • 它的工作方式就像“类”T[] 通过显式接口实现实现了IEnumerable&lt;T&gt;。如果你只是说_array.GetEnumerator(),你会得到public 方法,它有错误的返回类型。
  • @RayL 查看 .NET 2.0 版本的文档 :-) 更新。
  • 请注意。从引用的msdn.microsoft.com/en-us/library/system.array.aspx#Remarks:它实现了IList&lt;T&gt;ICollection&lt;T&gt;IEnumerable&lt;T&gt;泛型接口。
【解决方案2】:

您可以使用 System.Linq 命名空间中的泛型方法IEnumerable&lt;T&gt; OfType&lt;T&gt;(),它扩展了 IEnumerable 接口。它将过滤掉所有类型不同于 T 的元素并返回IEnumerable&lt;T&gt; collection。如果您使用(IEnumerable&lt;T&gt;)_array 转换运算符,它可能不安全,因为System.Array(和其他非泛型类型)存储System.Object 类型的项目。

【讨论】:

  • 只有对象数组(即Object[] arr)将项目存储为对象。除此之外,数组是类型安全的。这使得 OfType 和 Cast 方法变得多余。
猜你喜欢
  • 1970-01-01
  • 2011-04-04
  • 2011-07-29
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 2011-05-12
  • 2014-12-04
相关资源
最近更新 更多