事件中不需要EventHandler?

时间:2015-04-27 22:49:26

标签: c# delegates eventhandler

我在使用Ping类时注意到了这一点。我在实现PingCompleted回调方法时最初遵循C#的文档:

pingSender.PingCompleted += new PingCompletedEventHandler(PingCompletedCallback);

然而,当我在Timer的Elapsed事件中添加一个新方法时,我注意到我没有传递一个新的TimerElapsedEventHandler。相反,我只是按原样传递函数名称:

customTimer.Elapsed += CustomTimerElapsedCallback;

我使用PingCompleted事件测试了它,它仍然有效:

pingSender.PingCompleted += PingCompletedCallback;

我找不到任何具体解释原因的来源。任何人都可以解释为什么允许这样做以及EventHandler调用的是什么?

1 个答案:

答案 0 :(得分:2)

这是由C#编译器为您处理的。这是一个feature added in C# 2.0(请参阅"How to: Declare, Instantiate, and Use a Delegate")。

C#语言规范第6.6节规定:

  

从方法组(第7.1节)到兼容的委托类型存在隐式转换(第6.1节)。给定委托类型D和被分类为方法组的表达式E,如果E包含至少一个以其正常形式(第7.5.3.1节)适用于构造的参数列表的方法,则存在从E到D的隐式转换通过使用D

的参数类型和修饰符

基本上,您可以在代码中使用方法的名称(在您的情况下为{方法组,CustomTimerElapsedCallbackPingCompletedCallback),编译器将看到委托类型是必需的,并放入逻辑为你做转换。

pingSender.PingCompleted += PingCompletedCallback;pingSender.PingCompleted += new PingCompletedEventHandler(PingCompletedCallback);生成的IL与结果完全相同。

相关问题