Как мне реализовать IEnumerable в классе-обертке Dictionary, который реализует IEnumerable?

Я пытаюсь создать обертку для Dictionary.

Dictionary реализует IEnumerable>, но я хочу, чтобы мой класс-обертка реализовывал IEnumerable. Поэтому я попробовал следующее:

public class FooCollection : IEnumerable
{
    private Dictionary fooDictionary = new Dictionary();

    public IEnumerator GetEnumerator()
    {
        return fooDictionary.Values.GetEnumerator();
    }

    // Other wrapper methods omitted

}

Однако я получаю эту ошибку:

'FooCollection' не реализует член интерфейса 'System.Collections.IEnumerable.GetEnumerator()'. 'FooCollection.GetEnumerator()' не может реализовать 'System.Collections.IEnumerable.GetEnumerator()', потому что у него нет соответствующего типа возврата 'System.Collections.IEnumerator'.

Однако я не понимаю эту ошибку, потому что FooCollection.GetEnumerator() возвращает IEnumerator, а IEnumerator является IEnumerator.

EDIT:

Решение явно реализовать IEnumerator.GetEnumerator() работает. Однако теперь мне интересно, почему когда я "Go to definition" на List я вижу только одно определение GetEnumerator: public List.Enumerator GetEnumerator();

Видимо, List может иметь один метод GetEnumerator, который возвращает что-то, что реализует и IEnumerator и IEnumerator, но я должен иметь по одному методу для каждого?

EDIT:

Как ответил LukeH ниже, List действительно включает явные реализации интерфейса. Видимо, Visual Studio просто не перечисляет их при генерации заглушек методов из метаданных. (См. предыдущий вопрос: Почему в представлении VS Metadata не отображаются явные реализованные члены интерфейса )

Перед тем, как опубликовать этот вопрос, я попробовал проверить List (через "Go to Definition" в Visual Studio), чтобы узнать, нужно ли мне реализовать несколько версий GetEnumerator. Думаю, это был не самый надежный способ проверки.

В любом случае, я помечаю это как ответ. Спасибо за помощь.

7
задан Community 23 May 2017 в 11:59
поделиться