为什么.net中的数组只实现IEnumerable而不是IEnumerable <t>?</t>

时间:2010-05-05 13:47:25

标签: c# .net arrays ienumerable ienumerator

我正在实现自己的ArrayList类,当我意识到

时,我感到很惊讶
public System.Collections.Generic.IEnumerator<T> GetEnumerator() {
    return _array.GetEnumerator();
}

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

有没有解决办法?

由于

2 个答案:

答案 0 :(得分:59)

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

您可以添加演员:

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

请注意,较旧的MSDN(pre docs.microsoft.com)对此版本的报道在不同的.NET版本中发生了几次更改,请检查remarks部分。

答案 1 :(得分:-1)

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