C# 将方法作为EventDelegate传递

C# 将方法作为EventDelegate传递,c#,delegates,unity3d,ngui,C#,Delegates,Unity3d,Ngui,我正在尝试将方法作为参数传递。但是我得到了一个编译器错误,我不太明白我做错了什么 编译器错误为: 参数“%1”无法将“方法组”表达式转换为“EventDelegate”类型 公共类AssignEventDelegate:MonoBehavior{ 公共雪碧; public void AddOnFinish(EventDelegate方法){ 添加(sprite.GetComponent().onFinished,方法); } } 公共类AssignEventDelegateOther:MonoB

我正在尝试将方法作为参数传递。但是我得到了一个编译器错误,我不太明白我做错了什么

编译器错误为:

参数“%1”无法将“方法组”表达式转换为“EventDelegate”类型

公共类AssignEventDelegate:MonoBehavior{
公共雪碧;
public void AddOnFinish(EventDelegate方法){
添加(sprite.GetComponent().onFinished,方法);
}
}
公共类AssignEventDelegateOther:MonoBehavior{
//用于初始化
无效开始(){
//编译器错误发生在下面
GameObject.Find(“主摄像机”).GameObject.GetComponent().AddOnFinish(myOnFinish);
}
公共空间myOnFinish(){
Debugger.print(“myOnFinish”);
}
}

不要将方法作为参数传递,而是定义与方法具有相同签名的委托,并将其作为参数传递给函数。

首先让我们了解错误消息的含义。应该清楚的是,这条线有问题的部分是

.AddOnFinish( myOnFinish );
那么什么是方法组?这一点以前已经得到了回答。简而言之,编译器称之为对不包含()或任何参数列表的方法名的裸引用。不能单独使用方法组。它在CLR中没有任何表示形式。它是一个方法“组”,因为至少在理论上,它代表了一组编译器必须对其执行重载解析的方法。编译器知道如何将方法组(也包括lambda和匿名方法)转换为特定的委托类型,但仅此而已
myOnFinish
是一个方法组,但在这里它实际上只包含一个方法

快速查看一下NGUI文档,就会发现与它的名称相反,它不是一个委托类型,而只是一个用来包装委托的类

所以我们有了它。编译器不知道如何将方法组转换为此EventDelegate类,因此会产生错误

要修复它,我们需要提供转换。事实证明,这只是调用EventDelegate的构造函数:

.AddOnFinish( new EventDelegate(myOnFinish) );
这是因为构造函数采用了与
myOnFinish
兼容的委托类型
EventDelegate.Callback
的实例

.AddOnFinish( new EventDelegate(myOnFinish) );