如何在不收到无效的转换异常错误的情况下枚举此子类?

时间:2016-04-30 00:42:12

标签: c# class unity3d ienumerable

我一直在尝试使classTwo可枚举,但我收到一个错误,我不太明白,因为我正在查看的大部分资源都包含这段代码......

jsFiddle:

但我在返回线上收到错误。这是我的其余代码...

public IEnumerator GetEnumerator() {
    return (IEnumerator)this;
}

3 个答案:

答案 0 :(得分:1)

看看this sample code

首先,

return (IEnumerator)this; 

classTwo没有实现IEnumerator,因此您无法将其转换为IEnumerator

此外,如果要枚举classTwo,那么它应该实现IEnumerable。您将定义另一个实现IEnumerator的类,然后GetEnumerator将返回该类的实例。

答案 1 :(得分:1)

您收到错误是因为classTwo不是IEnumerator。您需要声明它是(class classTwo : IEnumerator),然后实施IEnumerator界面的方法(CurrentMoveNext()Reset()):

class classTwo : IEnumerator {

    public object Current {get;}
    public bool MoveNext() { ... }
    public void Reset() { ... }

    ...

    public IEnumerator GetEnumerator() 
    {
        return this; 
    }
}

如果您只想让它在foreach语句中可用,那么您可以使用yield语句编写迭代器:

public IEnumerator GetEnumerator()
{
     yield return a;
     yield return b;
     yield return c; 
}

答案 2 :(得分:0)

我知道它没有回答如何实现IEnumerable / IEnumerator的问题,但由于所有字段都是相同的类型(classOne),你可以简单地使用数组或集合(特定的列表)来&# 34;束"你可以在foreach循环中插入引用的引用(从你的一条评论中获取)。 classTwo,至少在你目前的形式,将变得多余。

usuage示例

//if you know how many elements it will be, use an array
ClassOne[] classOneArray = new ClassOne[3];
ClassOne[0] = new ClassOne(); //a
ClassOne[1] = new ClassOne(); //b
ClassOne[2] = new ClassOne(); //c
foreach(ClassOne element in classOneArray) {
    //do smthg
}

//if you dont know how many elements it will be, use a list
List<ClassOne> classOneList = new List<ClassOne>();
classOneList.Add(new ClassOne()); //a
classOneList.Add(new ClassOne()); //b
classOneList.Add(new ClassOne()); //c
foreach(ClassOne element in classOneList) {
    //do smthg
}

List<T>要求您使用System.Collections.Generic - 您还可以使用大量其他集合,具体取决于您需要放置数据的方式。

如果您有特定用例需要自己实现界面并参考其他两个答案,请忽略答案。