web-dev-qa-db-ja.com

GetEnumerator()でIEnumerable <T>を実装する方法?

タイプにIEnumerable<string>を実装してもらいたい。簡単にC#をフォローしようとしましたが、問題が発生しました:

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.IEnumerator」の対応する戻り型がないため、「System.Collections.IEnumerable.GetEnumerator()」を実装できません。

18
Colonel Panic

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();
    }
}
34
Filip Ekberg

IEnumerableでは、型付きメソッドとジェネリックメソッドの両方を実装する必要があります。

Msdnのコミュニティセクション docs では、両方が必要な理由が説明されています。 (後方互換性のために、本質的に与えられた理由です)。

6
NominSim