Текущее свойство T против IEnumerator current c# - PullRequest
0 голосов
/ 22 апреля 2020

Я реализовал стандартную 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;
    }
}

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

first: почему у меня два текущих свойства?

Поскольку generi c IEnumerator<T> наследует интерфейс non-generi c IEnumerator. Вам необходимо реализовать оба интерфейса, и T Current { get; } не удовлетворяет элементу object Current { get; } из IEnumerator. (T не может быть ссылочным типом.)

second: когда я помещаю точку отладки во второе свойство, я вижу, что это свойство никогда не выполняется, и когда я изменяю возвращаемое значение из этого свойства, ничего в моем код изменился.

Поскольку в вашем коде ничто не рассматривает экземпляр как IEnumerator; все обращается к нему как IEnumerator<T>.

Если вы присваиваете Seller<T> ссылку на объект IEnumerable ( не IEnumerable<T>), а затем пишете foreach l oop сверх того, вы будете видеть, как вызывается object IEnumerable.Current геттер.

0 голосов
/ 22 апреля 2020

См. Свойство IEnumerator.Current

Примечания для разработчиков

Реализация этого интерфейса требует реализации интерфейса nongeneri c IEnumerator. Свойство Current появляется на обоих интерфейсах и имеет разные типы возврата. Реализуйте свойство nongeneri c Current как явную реализацию интерфейса. Это позволяет любому потребителю интерфейса nongeneri c использовать интерфейс generi c.

...