T当前属性与IEnumerator当前c#

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

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;
    }
}
pengsy333 回答:T当前属性与IEnumerator当前c#

第一:为什么我有两个当前财产?

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

秒:当我在第二个属性中放置调试点时,我看到该属性永远不会执行,并且当我更改此属性的返回值时,我的代码没有任何改变。

因为代码中没有任何内容将实例视为T;一切都以IEnumerator的身份进行访问。

如果您将IEnumerator<T>对象引用分配给Seller<T>不是 IEnumerable),然后在其上编写一个IEnumerable<T>循环,则您看到调用foreach的getter。

,

请参见IEnumerator.Current Property

实施者注意事项

要实现此接口,需要实现非通用IEnumerator接口。 Current属性出现在两个接口上,并且具有不同的返回类型。将非通用Current属性实现为显式接口实现。这样,任何非通用接口的使用者都可以使用通用接口。

本文链接:https://www.f2er.com/2388567.html

大家都在问