пользовательская коллекция не может реализовать IEnumerable‹T›

Итак, у меня есть общий класс Node<T>, который выглядит так. Он просто содержит значение и ссылку на следующий Node<T>

public class Node<T>
{
    public T Value { get; set; }
    public Node<T> Next { get; set; }

    // Some Methods go here
}

Есть еще один класс под названием CustomLinkedList<T>, который выглядит так

public class CustomLinkedList<T> : IEnumerable<T>
{
    Node<T> m_first;
    Node<T> m_current;
    int m_length;

    public CustomLinkedList()
    {
        m_first = new Node<T>();
        m_current = m_first;
        m_length = 0;
    }

    // Adding, removing and other methods go here
}

Базово CustomLinkedList<T> - это набор Node<T>s. Это просто вызов самому себе собрать такую ​​коллекцию, как LinkedList<T> (по крайней мере, то, что я о ней думаю). В приведенном ниже коде показан пример того, как я реализовал добавленную функциональность.

public void AddLast(T value)
{
    m_current.Value = value;
    m_current.Next = new Node<T>();
    m_current = m_current.Next;
    m_length++;
}

public void AddFirst(T value)
{
    Node<T> newFirst = new Node<T>();
    newFirst.Value = value;
    newFirst.Next = m_first;
    m_first = newFirst;
    m_length++;
}

Существуют также методы AddAfter() и AddBefore(), а также некоторые методы RemoveXXX(). Итак, я хотел, чтобы CustomLinkedList<T> реализовал IEnumerable<T>, и мой метод GetEnumerator() выглядел так:

public IEnumerator<T> GetEnumerator()
{
    if (m_length > 0)
    {
        Node<T> nodeToReturn = m_first;
        for (int i = 0; i < m_length; i++)
        {
            if (nodeToReturn == null)
                break;
            yield return nodeToReturn.Value;
            nodeToReturn = nodeToReturn.Next;
        }
    }
}

Но компилятор жалуется на следующее

CustomGenericCollections.CustomLinkedList<T>' does not implement interface member 'System.Collections.IEnumerable.GetEnumerator()'. 'CustomGenericCollections.CustomLinkedList<T>.GetEnumerator()' cannot implement 'System.Collections.IEnumerable.GetEnumerator()' because it does not have the matching return type of 'System.Collections.IEnumerator'.

Я не могу понять, в чем проблема.


person Dimitri    schedule 21.08.2013    source источник


Ответы (1)


Поскольку IEnumerable<T> наследуется от IEnumerable, вам также необходимо реализовать неуниверсальный GetEnumerator(). Добавьте это в свой класс:

IEnumerator IEnumerable.GetEnumerator()
{
    return this.GetEnumerator();
}
person Magnus Grindal Bakken    schedule 21.08.2013
comment
Спасибо. работал как положено. - person Dimitri; 21.08.2013