Имена методов неявно приводятся к типам делегата - PullRequest
8 голосов
/ 24 апреля 2011

У меня небольшие проблемы с пониманием делегатов.

У меня есть делегат, который я буду вызывать при вводе символа y:

public delegate void respondToY(string msgToSend);

        private respondToY yHandler;

У меня есть метод подписки для вызова кодаможет запросить уведомление при вызове делегата:

public void Subscribe(respondToY methodName)
        {
            yHandler += methodName;
        }

Насколько я вижу, для регистрации в этом делегате мне нужно предоставить что-то типа responseToY.Тем не менее, при вызове метода подписки я могу указать либо новый экземпляр делегата, либо просто имя метода.Означает ли это, что любой метод, соответствующий сигнатуре делегата, может быть использован и будет автоматически преобразован в правильный тип делегата?

** Редактировать **

Так что в этом предположении он также будет действительнымчтобы предоставить только имя метода таким вещам, как обработчики событий щелчка для кнопок (при условии, что метод взял отправителя и соответствующий объект события), оно будет преобразовано в требуемый делегат?

Ответы [ 2 ]

9 голосов
/ 24 апреля 2011

Это преобразование группы методов . Он преобразует группу методов (в основном, имя метода или перегруженных методов) в экземпляр типа делегата с совместимой подписью.

Да, любой совместимый метод может быть использован. Обратите внимание, что вы также можете указать цель - например:

string text = "Hello there";
Func<int, int, string> func = text.Substring;

Console.WriteLine(func(2, 3)); // Prints "llo", which is text.Substring(2, 3)

Там должен быть конкретным типом делегата, включающим, хотя. Вы не можете просто использовать:

Delegate x = methodName;

... компилятор не знает тип создаваемого делегата.

Для получения дополнительной информации см. Раздел 6.6 спецификации языка C # 4.

Обратите внимание, что преобразование группы методов всегда создает новый экземпляр соответствующего делегата - он не кэшируется (и не может быть без нарушения спецификации.)

2 голосов
/ 24 апреля 2011

насколько я знаю ... да, тип делегата просто гарантирует, что подписи совпадают

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...