我有静态方法:
public static Init( IEnumerator param)
{
Box box = InitBox();
box.StartCorountine(param??)
}
我想将param作为动作传递给StarCorountine,如何向IEnumerator参数添加参数?
我有2个方法,我想在Init静态方法中调用其中一个,我不知道如何将方法作为参数传递。
private IEnumerator test1()
{
...
}
private IEnumerator test2(int i, int ii, ReferenceType t)
{
...
}
好吧,让我们说这个盒子只是MonoBehaviour类,从预制件初始化。
private static IEnumerator Wait(Box box, float time)
{
yield return new WaitForSeconds(time);
box.Open();
yield return new WaitForSeconds(time);
box.Close();
yield return new WaitForSeconds(time);
DestroyObject(box.gameObject);
}
我通常在Init StartCorountine上使用Wait方法,但现在我必须在关闭后添加一个动作,我想在Init StartCorountine上重载方法
答案 0 :(得分:2)
Init(test1());
是作为协程运行的方法的 return 值,而不是方法本身
根据您的示例代码,这是一个有效的调用:
test1()
为什么不是,你正在调用Init()
,它会产生并返回一个值,你将该值传递给StartCoroutine()
,然后传递给test1()
,没错。 Init()
的其余部分将在以后正常调用。
如果您要执行的操作是将方法参考传递给StartCoroutine(param());
,并且您希望这样做:
public delegate void MyDelegate();
void someFunc() {
MyDelegate p = test1;
Init(p);
}
public IEnumerator test1() {
...
}
public static void Init(MyDelegate param) {
...
StartCoroutine(param());
}
你做不到。好吧,不是你想要的方式。
Delegates
确实存在并且将覆盖传递方法引用,但是委托是严格类型的,并且不支持您似乎想要具有的变体行为。我不确定任何语言都会支持你在这种情况下尝试做的事情。如果您想要一个严格定义的委托,请确保:
test2(...)
但请注意,这根本不包括Init()
。这是因为test2具有与test1不同的参数,并且需要单独的委托,并且委托不遵循继承规则,它们是严格类型:所有参数必须完全声明(没有泛型 1 )并且不能相互继承。要支持test2,您必须编写一个第二个 int i, int ii, ReferenceType t
方法,该方法接受一个具有三个参数public delegate void MyDelegate(<T> obj);
的委托,所有参数都已声明。
1 Unity在.NET 2.0上运行,如果我没记错的话,协方差和逆变(允许像$(this).siblings('.panel-heading').find('.count-checked-checkboxes')
这样的功能的东西)直到4.0才被添加到.NET框架中。可能已经3.5了。
Unity 2017更新为在.NET 3.5上运行(提供.NET 4.6实验)并且应该能够在通用定义中进行协方差和逆变,尽管我自己还没有对它进行过探索。