T 当前 属性 vs IEnumerator 当前 c#

T current property vs IEnumerator current c#

我实现了 IEnumerable 和 IEnumerator 的通用版本。在 IEnumerator 我有两个电流 属性 1-T电流 2- IEnumerator.Current 第一:为什么我有两个电流属性? 第二:当我将调试点放在第二个 属性 时,我看到这个 属性 永远不会执行,当我从这个 属性 更改 return 值时,我的代码中没有任何改变。 请有人描述一下

public class Seller<T> : IEnumerable<T>
{
    T[] _array;

    public Seller(T[] list)
    {
        _array = list;
    }


    public IEnumerator<T> GetEnumerator()
    {
        return  new UserDefinedEnum<T>(_array);
    }

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


public class UserDefinedEnum<T> : IEnumerator<T>
{
    int _index = -1;

    T[] _array;

    public UserDefinedEnum(T[] list)
    {
        _array = list;
    }

    public T Current
    {

        get
        {
            return _array[_index];
        }
    }

    object IEnumerator.Current
    {
        get
        {
            return null;
        }

    }

    public void Dispose()
    {

    }

    public bool MoveNext()
    {
        _index++;
        return _index < _array.Length;
    }

    public void Reset()
    {
        _index = -1;
    }
}

first: why i have two current property?

因为泛型IEnumerator<T>继承了非泛型IEnumerator接口。您需要实现这两个接口,并且 T Current { get; } 不满足 IEnumeratorobject Current { get; } 成员。 (T 可能不是引用类型。)

second: when i put debug point in second property i saw that this property never execute and when i change return value from this property nothing in my code changed.

因为您的代码中没有任何内容将实例视为 IEnumerator;一切都以 IEnumerator<T>.

的形式访问它

如果您将 Seller<T> 对象引用分配给 IEnumerable 而不是 IEnumerable<T>),然后写入 foreach遍历它,你 看到 object IEnumerable.Current getter 被调用。

IEnumerator.Current Property

Notes to Implementers

Implementing this interface requires implementing the nongeneric IEnumerator interface. The Current property appears on both interfaces, and has different return types. Implement the nongeneric Current property as an explicit interface implementation. This allows any consumer of the nongeneric interface to consume the generic interface.