将没有签名的委托分配给EventHandler - 这是如何工作的?

时间:2011-03-11 06:29:29

标签: c# delegates event-handling

如果我这样做:

EventHandler foobar = new EventHandler(fooMethod);

fooMethod必须是具有以下签名的方法:

public void fooMethod(object obj, EventArgs args){}

对我有意义。但是,这段代码运行得很好:

EventHandler foo = delegate { };
这是怎么回事?我原以为我需要这样做:

EventHandler foo = delegate(object obj, EventArgs arg) { };

以上一行确实有用。我很困惑如何将“空”委托分配给EventHandler。

感谢任何可以照亮我的人!

1 个答案:

答案 0 :(得分:4)

匿名方法(通过delegate { /* body */ }构建委托的方式有两种形式:

delegate (parameter list)
{
    // body
}

delegate
{
    // body
}

第二种形式可以转换为任何不使用out参数的委托类型(IIRC - 它也可能无法应对ref)假设返回值与委托的返回类型匹配类型。例如:

Func<int> foo = delegate { return 5; };

如果您不关心参数,这个表格很方便。请注意,它增加了表达式可以转换为的委托类型的数量,这可能会混淆重载:

new Thread(delegate { Console.WriteLine("Error - ambiguous"); });
new Thread(delegate() { Console.WriteLine("Fine - ThreadStart"); });
new Thread(delegate(object state) {
    Console.WriteLine("Fine - ParameterizedThreadStart");
});