C#:自定义 IEnumerator?
C#: Custom 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();
}
}
如果我实例化 class,然后每帧调用一次 "Update",我会在日志中得到以下输出:
0
1
2
3
4...
这很好用,但是我想在 IEnumerator 本身中实现一些自定义功能。但是如果我创建以下内容:
public class myIEnumerator : IEnumerator
{
public int myCustValue;
public void myCustFunction(){}
}
然后更新原始 class,替换 "IEnumerator" 和 "myIEnumerator",我得到以下错误:
The body of `myClass.theEnumerator()' cannot be an iterator block because `myIEnumerator ' is not an iterator interface type
我在这里做错了什么,我怎样才能制作自己的自定义 IEnumerator?
我不熟悉 Unity,但我认为您必须实现 IEnumerator
接口。缺少方法 MoveNext()
和 Reset()
。
您只能在 return 类型为 IEnumerator
、IEnumerable
、IEnumerator<T>
或 IEnumerable<T>
的方法中使用 yield
。您不能将方法的 return 类型更改为实现这些接口之一的类型,这没有意义。
原因是 C# 编译器生成了一个特殊的 class 来实现这 4 个接口之一(实际上它同时实现了 IEnumerator
和 IEnumerable
或其通用版本) 并且该编译器生成的实例 class 是实际从该方法中获取 return 的实例。通过更改 return 类型,您试图说编译器将创建一个 class 的实例来进行枚举。但它不能那样做,因为它实际上对你的 class 一无所知(事实上你的 class 甚至可能无法正确枚举)。
这是一条关于 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();
}
}
如果我实例化 class,然后每帧调用一次 "Update",我会在日志中得到以下输出:
0
1
2
3
4...
这很好用,但是我想在 IEnumerator 本身中实现一些自定义功能。但是如果我创建以下内容:
public class myIEnumerator : IEnumerator
{
public int myCustValue;
public void myCustFunction(){}
}
然后更新原始 class,替换 "IEnumerator" 和 "myIEnumerator",我得到以下错误:
The body of `myClass.theEnumerator()' cannot be an iterator block because `myIEnumerator ' is not an iterator interface type
我在这里做错了什么,我怎样才能制作自己的自定义 IEnumerator?
我不熟悉 Unity,但我认为您必须实现 IEnumerator
接口。缺少方法 MoveNext()
和 Reset()
。
您只能在 return 类型为 IEnumerator
、IEnumerable
、IEnumerator<T>
或 IEnumerable<T>
的方法中使用 yield
。您不能将方法的 return 类型更改为实现这些接口之一的类型,这没有意义。
原因是 C# 编译器生成了一个特殊的 class 来实现这 4 个接口之一(实际上它同时实现了 IEnumerator
和 IEnumerable
或其通用版本) 并且该编译器生成的实例 class 是实际从该方法中获取 return 的实例。通过更改 return 类型,您试图说编译器将创建一个 class 的实例来进行枚举。但它不能那样做,因为它实际上对你的 class 一无所知(事实上你的 class 甚至可能无法正确枚举)。