C#: Custom IEnumerator?
本文关键字:IEnumerator Custom | 更新日期: 2023-09-27 18:25:35
这是一条关于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(){}
}
然后更新orinal类,将"IEnumerator"替换为"myIEnumerater",我得到以下错误:
The body of `myClass.theEnumerator()' cannot be an iterator block because `myIEnumerator ' is not an iterator interface type
我在这里做错了什么,如何制作自己的自定义IEnumerator?
只能在返回类型为IEnumerator
、IEnumerable
、IEnumerator<T>
或IEnumerable<T>
的方法中使用yield
。不能将方法的返回类型更改为实现其中一个接口的类型,这是没有意义的。
原因是C#编译器生成了一个特殊的类,该类实现了这4个接口中的一个(实际上它同时实现了IEnumerator
和IEnumerable
或其通用版本),并且该编译器生成的类的实例实际上是从该方法返回的。通过更改返回类型,您试图说明编译器将创建一个执行枚举的类实例。但它不能做到这一点,因为它实际上对您的类一无所知(事实上,您的类甚至可能无法正确枚举)。
我不熟悉Unity,但我认为您必须实现IEnumerator
接口。缺少方法MoveNext()
和Reset()
。
查看IEnumerator接口