这是与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?
答案 0 :(得分:2)
您只能在返回类型为yield
,IEnumerator
,IEnumerable
或IEnumerator<T>
的方法中使用IEnumerable<T>
。您无法将方法的返回类型更改为实现其中一个接口的类型,这是没有意义的。
这样做的原因是C#编译器生成一个特殊的类来实现这4个接口中的一个(实际上它实现了IEnumerator
和IEnumerable
或其通用版本)和一个实例编译器生成的类是从该方法实际返回的内容。通过更改返回类型,您试图说编译器将创建将执行枚举的类的实例。但它无法做到这一点,因为它实际上并不知道你的课程(事实上你的课程甚至可能都没有正确列举)。
答案 1 :(得分:0)
我不熟悉Unity,但我认为你必须实现IEnumerator
接口。缺少方法MoveNext()
和Reset()
。