【问题标题】:Implement IEnumerable for a collection class?为集合类实现 IEnumerable?
【发布时间】:2013-11-12 05:42:19
【问题描述】:

我想了解这个主题,而不仅仅是能够放弃语法。我有一个名为 IGroupNode 的集合类,它最多可以容纳 8 个子 ISceneNode。

internal class GroupNode : IGroupNode
{
    public string Name
    {
        get;
        private set;
    }

    const int NumberOfChildren = 8;
    #region Member variables
    private IList<ISceneNode> children = new List<ISceneNode>(NumberOfChildren);
    #endregion

    public IEnumerable<ISceneNode> GetEnumerator()
    {
        //?
    }

您可能会说,它是一个非常简单的基于列表的集合类。我怎样才能在这里实现 IEnumerable 只需返回 内部容器的枚举器?在这种非常简单的情况下,我不确定如何做到这一点。

现在我遇到了这个问题:

'Weber.SceneGraphCore.GroupNode' does not implement interface member 'System.Collections.IEnumerable.GetEnumerator()'. 'Weber.SceneGraphCore.GroupNode.GetEnumerator()' cannot implement 'System.Collections.IEnumerable.GetEnumerator()' because it does not have the matching return type of 'System.Collections.IEnumerator'.

【问题讨论】:

    标签: c# foreach enumerable enumerator


    【解决方案1】:

    在这种情况下,您可以简单地返回 children.GetEnumerator()。 (顺便说一下,您的 GroupNode 对象应该实现 IEnumerable 并且您的 GetEnumerator 方法应该具有正确的返回类型。)

    public IEnumerator<ISceneNode> GetEnumerator()
    {
        return children.GetEnumerator()
    }
    

    在更一般的情况下,尽管您可以迭代某些内容并为每个元素调用 yield return

    【讨论】:

    • 不能将 IEnumerable 隐式定义为 IEnumerator
    • 你把GetEnumerator的返回类型改成IEnumerator了吗?
    • 不,但那是如何工作的。那么,类实现了IEnumerable,但在实际实现中,我实现了IEnumerator?为什么这行得通..
    • 你是对的,我只是希望 IEnumerable 现在可以完全实现。我将尝试继续,看看我是否遇到任何问题(感谢智能感知)
    • "在实际实现中我实现了 IEnumerator" 这不准确。阅读接口 IEnumerable 的文档。注意方法的返回类型。当然接口 A 可以有一个返回 B 类型对象的方法。
    【解决方案2】:

    由于 IList 已经实现了 IEnumerable&lt;&gt;,因此您可以在您的 GetEnumerator() 方法中返回 children.GetEnumerator()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 2017-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多