如何使用GetEnumerator()实现IEnumerable<T>?

23

我希望我的类型实现 IEnumerable<string> 接口。我已经尝试按照 C# in a Nutshell 的方法,但似乎出了些问题:

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'。


另外:您可以直接从GetEnumerator()内部使用yield return - Alex
2个回答

41

你漏掉了 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();
    }
}

有个问题,但是@NominSim在下面的帖子中回答了 - 算了! - user2821275
谢谢,现在我可以将这个添加到我的 EF TT 文件中了 ;-) - Mike_Matthews_II
2
请注意,让Visual Studio为您输入此内容。当您键入public class Simulation : IEnumerable<string>时,请右键单击IEnumerable部分并选择“实现接口”>“实现接口”。Visual Studio将填写您尚未填写的接口部分。 - user2023861

8

IEnumerable要求您实现类型化和泛型方法。

在msdn文档的社区部分,解释了为什么需要这两个方法。(基本上是出于向后兼容性的原因)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接