1

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

编译器错误是:

参数“#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");
    }
}
4

2 回答 2

1

首先让我们理解错误消息。应该清楚的是,该行的问题部分是

.AddOnFinish( myOnFinish );

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

快速浏览一下 NGUI 文档告诉我,与它的名字相反,EventDelegate不是一个委托类型,而只是一个用于包装委托的类。

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

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

.AddOnFinish( new EventDelegate(myOnFinish) );

这是可行的,因为构造函数采用了一个EventDelegate.CallbackmyOnFinish.

于 2014-08-10T08:36:46.483 回答
0

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

于 2014-08-10T07:20:12.893 回答