为集合类实现 IEnumerable?
Posted
技术标签:
【中文标题】为集合类实现 IEnumerable?【英文标题】:Implement IEnumerable for a collection class? 【发布时间】: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'.
【问题讨论】:
【参考方案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<>
,因此您可以在您的 GetEnumerator()
方法中返回 children.GetEnumerator()
。
【讨论】:
以上是关于为集合类实现 IEnumerable?的主要内容,如果未能解决你的问题,请参考以下文章
InvalidCastException:无法将“System.Collections.Generic.List”类型的对象转换为 System.Collections.Generic.IEnumer
C#定义一个泛型集合类。要求:实现Ienumerable<T>接口,T是值类型,并T取2个类型分别测试。