Я пытаюсь создать обертку для 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
Видимо, List
может иметь один метод GetEnumerator
, который возвращает что-то, что реализует и IEnumerator
и IEnumerator
, но я должен иметь по одному методу для каждого?
EDIT:
Как ответил LukeH ниже, List
действительно включает явные реализации интерфейса. Видимо, Visual Studio просто не перечисляет их при генерации заглушек методов из метаданных. (См. предыдущий вопрос: Почему в представлении VS Metadata не отображаются явные реализованные члены интерфейса )
Перед тем, как опубликовать этот вопрос, я попробовал проверить List
(через "Go to Definition" в Visual Studio), чтобы узнать, нужно ли мне реализовать несколько версий GetEnumerator. Думаю, это был не самый надежный способ проверки.
В любом случае, я помечаю это как ответ. Спасибо за помощь.