Как реализовать IEnumerable <T> с помощью GetEnumerator()?

Я бы хотел, чтобы мой тип реализовал IEnumerable<string>. Я попытался следовать С# в двух словах, но что-то пошло не так:

public class Simulation : IEnumerable<string>
{
    private IEnumerable<string> Events()
    {
        yield return "a";
        yield return "b";
    }

    public IEnumerator<string> GetEnumerator()
    {
        return Events().GetEnumerator();
    }
}

Но я получаю ошибку сборки

Ошибка 1 'EventSimulator.Simulation' не реализует член интерфейса 'System.Collections.IEnumerable.GetEnumerator()'. "EventSimulator.Simulation.GetEnumerator() не может реализовать" System.Collections.IEnumerable.GetEnumerator() ", потому что у него нет соответствующего типа возврата" System.Collections.IEnumerator ".

Ответ 1

Вам не хватает IEnumerator IEnumerable.GetEnumerator():

public class Simulation : IEnumerable<string>
{
    private IEnumerable<string> Events()
    {
        yield return "a";
        yield return "b";
    }

    public IEnumerator<string> GetEnumerator()
    {
        return Events().GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

Ответ 2

IEnumerable требует, чтобы вы реализовали как типизированный, так и общий метод.

В разделе сообщества msdn docs объясняется, почему вам нужны оба. (Для обратной совместимости это причина, по существу).