委托实例化 - 澄清

时间:2010-03-27 07:10:43

标签: asp.net delegates

当我有代表

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)and(2)我没有实例化它直接指向匿名方法的委托。但是在(3)的情况下,我需要实例化委托并传递静态方法。对于案例(3)我不能像PrintMe c= HelpMe(); ?那样声明。(1)和(2)如何工作?

3 个答案:

答案 0 :(得分:3)

由于方法组和委托之间的隐式转换,您可以说

(3)
PrintMe c = HelpMe;

即。没有括号

答案 1 :(得分:1)

PrintMe c = HelpMe;

答案 2 :(得分:1)

在(1)和(2)中,编译器隐式将lambda表达式转换为委托。

如果您尝试

PrintMe c= HelpMe();

然后您告诉编译器生成对HelpMe的调用,并将该调用的结果分配给c。 相反,你可以做

PrintMe c = HelpMe;

这里,HelpMe会出现所谓的方法组(它不仅仅是一个方法,因为它可能有重载),如果有的话可以转换为委托组中至少有一个方法适合代表。