Делегация Instantiation -Уточнение - PullRequest
2 голосов
/ 27 марта 2010

Когда у меня есть такой делегат, как

public delegate void PrintMe();

(1)
PrintMe a = delegate() { MessageBox.Show("Hello"); };
a();

(2)
PrintMe b = () => { MessageBox.Show("Hello"); };
b();

(3)
PrintMe c = new PrintMe(HelpMe);
c();

static void HelpMe()
{
   MessageBox.Show("Help Me");
}

for (1) и (2) Я не создал экземпляр делегата, он прямо указывает на анонимные методы. Но, как и в случае (3), мне нужно создать экземпляр делегата и передать статический method.for case (3) ) я не могу объявить как PrintMe c= HelpMe(); ?. Как (1) и (2) работают?

Ответы [ 3 ]

3 голосов
/ 27 марта 2010

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

(3)
PrintMe c = HelpMe;

т.е. без скобок

1 голос
/ 27 марта 2010

В (1) и (2) компилятор неявно преобразует ваше лямбда-выражение в делегат.

Если попытаться сделать

PrintMe c= HelpMe();

затем вы говорите компилятору сгенерировать вызов HelpMe и присвоить результат этого вызова c. Вместо этого вы можете сделать

PrintMe c = HelpMe;

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

1 голос
/ 27 марта 2010
PrintMe c = HelpMe;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...