我正在尝试将方法作为参数传递。但我收到编译错误,我不明白我做错了什么?
编译错误是:
参数“#1”无法将“方法组”表达式转换为“EventDelegate”类型
public class AssignEventDelegate : MonoBehaviour {
public UISprite sprite;
public void AddOnFinish (EventDelegate method) {
EventDelegate.Add (sprite.GetComponent<TweenScale>().onFinished, method);
}
}
public class AssignEventDelegateOther : MonoBehaviour {
// Use this for initialization
void Start () {
// Compiler error occurs below
GameObject.Find ("Main Camera").gameObject.GetComponent<AssignEventDelegate>().AddOnFinish( myOnFinish );
}
public void myOnFinish () {
Debugger.print ("myOnFinish");
}
}
答案 0 :(得分:1)
首先让我们理解错误信息。应该清楚的是,该行的问题部分是
.AddOnFinish( myOnFinish );
那么什么是方法组?之前已经回答here。简而言之,它是编译器调用对不包含()或任何参数列表的方法名称的裸引用。您不能单独使用方法组。它在CLR中没有任何表示。它是一个方法“组”,因为,至少在理论上,它代表了一组编译器必须对其进行重载决策的方法。编译器知道如何将方法组(也是lambdas和匿名方法)转换为特定的委托类型,但就是这样。 myOnFinish
是一个方法组,但在这里它实际上只包含一个方法。
快速浏览NGUI文档告诉我,与其名称相反,EventDelegate不是委托类型,而只是一个用于包装委托的类。
所以我们拥有它。编译器不知道如何将方法组转换为此EventDelegate类,并且它会产生错误。
要修复它,我们需要提供转换。结果证明,它只是调用EventDelegate的构造函数:
.AddOnFinish( new EventDelegate(myOnFinish) );
这是有效的,因为构造函数采用EventDelegate.Callback
的实例,它是与myOnFinish
兼容的委托类型。
答案 1 :(得分:0)
不是将方法作为参数传递,而是定义具有与方法相同的签名的委托,并将其作为参数传递给函数。