Вопрос о IEnumerator.GetEnumerator в C # - PullRequest
1 голос
/ 17 сентября 2010

У меня вопрос по поводу метода IEnumerator.GetEnumerator().

public class NodeFull
{
    public enum Base : byte {A = 0, C, G, U };
    private int taxID;
    private List<int> children;

    public int TaxID
    {
        get { return taxID; }
        set { taxID = value; }
    }

    public int this[int i]
    {
        get { return children[i]; }
        set { children[i] = value; }
    }

    public IEnumerator GetEnumerator()
    {
        return (children as IEnumerator).GetEnumerator();
    }

    public TaxNodeFull(int taxID)
    {
        this.taxID = taxID;
        this.children = new List<int>(3);
    }
}

Когда я пытаюсь скомпилировать, появляется сообщение об ошибке

'System.Collections.IEnumerator' не содержит определения для 'GetEnumerator', и метод расширения 'GetEnumerator', принимающий первый аргумент типа 'System.Collections.IEnumerator', не найден (вы пропустили директиву using ссылка на сборку?)

Что-то не так с кодом?

Заранее спасибо


Спасибо, ребята. Я понял.

Ответы [ 3 ]

8 голосов
/ 17 сентября 2010

Это IEnumerable.GetEnumerator() (или IEnumerable<T>.GetEnumerator()), а не IEnumerator.GetEnumerator().Членами IEnumerator являются MoveNext(), Current и Reset()Dispose для универсальной версии).IEnumerable - это «нечто, что может быть повторено» (например, список), а IEnumerator представляет текущее состояние в этой итерации - как курсор базы данных.

Немного странно, что ваш класс не '• реализовать IEnumerable или IEnumerable<T>.Я бы ожидал что-то вроде этого:

class NodeFull : IEnumerable<int>
{
    ... other stuff as normal ...

    public IEnumerator<int> GetEnumerator()
    {
        return children.GetEnumerator();
    }

    // Use explicit interface implementation as there's a naming
    // clash. This is a standard pattern for implementing IEnumerable<T>.
    IEnumerator IEnumerable.GetEnumerator()
    {
        // Defer to generic version
        return GetEnumerator();
    }
}
2 голосов
/ 17 сентября 2010

children - это List<int>, который реализует IEnumerable<int> и IEnumerable. Для этих интерфейсов определен метод GetEnumerator(), а не для IEnumerator.

children as IEnumerator должно привести к нулю.

1 голос
/ 17 сентября 2010

В интерфейсе IEnumerator нет метода GetEnumerator().Возможно, вы пытаетесь использовать интерфейс IEnumerABLE ?

...