我在使用Ping类时注意到了这一点。我在实现PingCompleted回调方法时最初遵循C#的文档:
pingSender.PingCompleted += new PingCompletedEventHandler(PingCompletedCallback);
然而,当我在Timer的Elapsed事件中添加一个新方法时,我注意到我没有传递一个新的TimerElapsedEventHandler。相反,我只是按原样传递函数名称:
customTimer.Elapsed += CustomTimerElapsedCallback;
我使用PingCompleted事件测试了它,它仍然有效:
pingSender.PingCompleted += PingCompletedCallback;
我找不到任何具体解释原因的来源。任何人都可以解释为什么允许这样做以及EventHandler调用的是什么?
答案 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
的参数类型和修饰符
基本上,您可以在代码中使用方法的名称(在您的情况下为{方法组,CustomTimerElapsedCallback
或PingCompletedCallback
),编译器将看到委托类型是必需的,并放入逻辑为你做转换。
pingSender.PingCompleted += PingCompletedCallback;
和pingSender.PingCompleted += new PingCompletedEventHandler(PingCompletedCallback);
生成的IL与结果完全相同。