Timer timer = new Timer();
BackgroundWorker bw = new BackgroundWorker();
EventHandler HandleStuff = delegate { MessageBox.Show("HandleStuff called"); };
timer.Tick += HandleStuff;
bw.RunWorkerCompleted += HandleStuff;
不允许使用最后一行,因为:
无法隐式转换类型' System.EventHandler' to' System.ComponentModel.RunWorkerCompletedEventHandler'
2个问题: 为什么RunWorkerCompleted不能接受常规的EventHandler - 已完成的事件不是多线程的,是否存在这种限制的原因?
更重要的是,有没有可以实现这一目标?我想对Timer.Tick
和bw.RunWorkerCompleted
答案 0 :(得分:1)
为什么RunWorkerCompleted不能接受常规的EventHandler?
因为签名与事件不匹配。 (并且代表通过co / contra-variance不等同)。根据定义,处理程序总是需要与事件的委托类型相同。
更重要的是,有没有可以实现这一目标?
根据确切的参考,你将无法附加那个确切的处理程序,没有。你能做的最好的事情就是创建一个适当类型的新事件处理程序,除了调用你真正希望它执行的代码之外,它除了调用你真正希望它执行的代码之外什么都不做:
bw.RunWorkerCompleted += (s,args)=> HandleStuff(s,EventArgs.Empty);