C#:自定义IEnumerator?

时间:2015-12-02 23:24:07

标签: c# ienumerator

这是与Unity中的C#有关的消息,但我假设一般的C#知识将​​适用。

请使用以下代码:

class myClass
{
    IEnumerator myEnumerator;
    public IEnumerator theEnumerator()
    {
        int i = 0;
        while (true)
        {
            Debug.Log(i++);
            yield return null;
        }
    }

    public void Update()
    {
        if (myEnumerator == null) { myEnumerator = theEnumerator(); }
        myEnumerator.MoveNext();
    }
}

如果我实例化那个类,那么每帧调用一次“Update”,我会在日志中得到以下输出:

0
1
2
3
4...

这很好,但是我想在IEnumerator本身中实现一些自定义功能。但是,如果我创建以下内容:

public class myIEnumerator : IEnumerator
{
    public int myCustValue;
    public void myCustFunction(){}
}

然后更新oringal类,将“IEnumerator”替换为“myIEnumerator”,我收到以下错误:

The body of `myClass.theEnumerator()' cannot be an iterator block because `myIEnumerator ' is not an iterator interface type

我在这里做错了什么,如何制作自己的自定义IEnumerator?

2 个答案:

答案 0 :(得分:2)

您只能在返回类型为yieldIEnumeratorIEnumerableIEnumerator<T>的方法中使用IEnumerable<T>。您无法将方法的返回类型更改为实现其中一个接口的类型,这是没有意义的。

这样做的原因是C#编译器生成一个特殊的类来实现这4个接口中的一个(实际上它实现了IEnumeratorIEnumerable或其通用版本)和一个实例编译器生成的类是从该方法实际返回的内容。通过更改返回类型,您试图说编译器将创建将执行枚举的类的实例。但它无法做到这一点,因为它实际上并不知道你的课程(事实上你的课程甚至可能都没有正确列举)。

答案 1 :(得分:0)

我不熟悉Unity,但我认为你必须实现IEnumerator接口。缺少方法MoveNext()Reset()

查看IEnumerator Interface