泛型 class 中的 GetEnumerator 实现

GetEnumerator realization within generic class

我有一个自定义数组 class public class CustomArray<T> : IEnumerable<T> 具有通用 属性:

public T[] Array
{
    get;
}

如何实现 GetEnumerator?我现在拥有的:

public IEnumerator<T> GetEnumerator()
{
    return (IEnumerator<T>)Array.GetEnumerator();
}

IEnumerator IEnumerable.GetEnumerator()
{
    return Array.GetEnumerator();
}

但是第一个没有通过单元测试。
结果消息:

System.InvalidCastException : Unable to cast object of type 'System.SZArrayEnumerator' to type 'System.Collections.Generic.IEnumerator`1[System.Int32]'.

IEnumerable.GetEnumerator()IEnumerabl<T>.GetEnumerator()两个签名相同,正常声明会冲突

因此,一般前者直接添加(作为较旧的接口),后者作为显式接口实现添加,只能通过显式转换访问:

public IEnumerator<T> GetEnumerator()
{
    return ((IEnumerable<T>)Array).GetEnumerator();
}

旁注:

一维数组实际上并不直接实现任何接口。这是因为 Array class 中的所有代码都不知道类型或维度,并且无法使用静态类型访问数组。

因此 a class called SZArrayHelper 实现了所有接口,并且 CLR 被编码为使用技巧来转换数组,就好像它们实际上是那种类型一样。