Передать метод как EventDelegate

Я пытаюсь передать метод в качестве параметра. Но я получаю ошибку компилятора, и я не совсем понимаю, что я делаю неправильно?

Ошибка компилятора:

Аргумент "#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");
    }
}

2 ответа

Решение

Сначала давайте разберемся с сообщением об ошибке. Должно быть ясно, что проблемная часть этой линии

.AddOnFinish( myOnFinish );

Так что же такое группа методов? Здесь уже отвечали раньше. Короче говоря, это то, что компилятор называет голой ссылкой на имя метода, который не включает () или какой-либо список аргументов. Вы не можете использовать группу методов самостоятельно. Он не имеет никакого представления в CLR. Это метод "группа", потому что, по крайней мере в теории, он представляет собой набор методов, с которыми компилятору придется выполнять разрешение перегрузки. Компилятор знает, как превратить группы методов (также лямбда-выражения и анонимные методы) в конкретные типы делегатов, но это все. myOnFinish является группой методов, но здесь она действительно содержит только один метод.

Беглый взгляд на документы NGUI говорит мне, что вопреки своему названию EventDelegate - это не тип делегата, а просто класс, предназначенный для переноса делегата.

Так что у нас это. Компилятор не знает, как преобразовать группу методов в этот класс EventDelegate, и он выдает ошибку.

Чтобы это исправить, нам нужно предоставить конверсию. Что получается, просто вызовет конструктор EventDelegate:

.AddOnFinish( new EventDelegate(myOnFinish) );

Это работает, так как конструктор берет экземпляр EventDelegate.Callback который является типом делегата, который совместим с myOnFinish,

Вместо передачи метода в качестве аргумента определите делегата, имеющего ту же сигнатуру, что и метод, и передайте его в качестве аргумента функции.

Другие вопросы по тегам