2010-03-27 69 views
2

当我有委托等代表实例化-Clarification

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"); 
} 

为(1)和(2)没instatntiate它直接指向匿名methods.But如在的情况下,委托(3) (3)我不能申报像PrintMe c= HelpMe(); ?。(1)和(2)是如何工作的?

回答

1
PrintMe c = HelpMe; 
3

由于法团和代表之间的隐式转换,你可以说

(3) 
PrintMe c = HelpMe; 

即没有括号

+0

糟糕!我多傻! – user274364 2010-03-27 07:26:23

1

在(1)和(2)编译器的lambda表达式隐式转换为代表。

如果你尝试做

PrintMe c= HelpMe(); 

,那么你是在告诉编译器生成HelpMe呼叫并分配呼叫c的结果。 相反,你可以做

PrintMe c = HelpMe; 

这里,HelpMe occours作为所谓的方法组(它不只是一个的方法,因为它可能有过载),它可以被转换成一个代表如果组中至少有一种方法适合委托。