Why do arrays in .net only implement IEnumerable a

2019-01-13 17:43发布

I was implementing my own ArrayList class and was left surprised when I realised that

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

didn't work. What is the reason arrays don't implement IEnumerator in .NET?

Is there any work-around?

Thanks

2条回答
做自己的国王
2楼-- · 2019-01-13 18:06

Arrays do implement IEnumerable<T>, but it is done as part of the special knowledge the CLI has for arrays. This works as if it were an explicit implementation (but isn't: it is done at runtime). Many tools will not show this implementation, this is described in the Remarks section of the Array class overview.

You could add a cast:

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

Note, older MSDN (pre docs.microsoft.com) coverage of this changed a few times with different .NET versions, check for the remarks section.

查看更多
Root(大扎)
3楼-- · 2019-01-13 18:18

You can use generic method IEnumerable<T> OfType<T>() from System.Linq namespace, which extends IEnumerable interface. It will filter out all elements which type is different than T and return IEnumerable<T> collection. If you use (IEnumerable<T>)_array conversion operator, it might not be safe, because System.Array (and other nongeneric types) stores items of type System.Object.

查看更多
登录 后发表回答