Action 无法转换为EventHandler?

我正在连接一个事件以使用一个lambda,它需要在触发后自行移除。 我无法通过将lambda内联到+ =事件(没有用于删除事件的可访问变量)来做到这一点所以我设置了一个Action变量并将lambda移动到那里。 主要错误是它无法将Action转换为EventHandler。 我认为lambda表达式可以隐式转换为事件处理程序,为什么这不起作用?

Lambdas可以隐式转换为具有正确形状的委托类型,但是两个相同形状的委托类型不能隐式地相互转换。 只需使局部变量具有类型EventHandler。

 EventHandler h = (o, ea) => { ... }; e += h; ... e -= h; 

(如果它有帮助:

 Action a = (o, ea) => { }; EventHandler e = a; // not allowed EventHandler e2 = (o,ea) => a(o,ea); // ok 

 Action a = (o, ea) => { }; EventHandler e = a.Invoke; 

通常,委托不能被强制转换,因为它们没有定义哪些强制转换有效的inheritance树。 为此,您有两个选择:

  1. 使用EventHandler类型的变量而不是Action
  2. 使用内联声明。

     // option 1: local variable EventHandler eh = (o, ea) => { /* [snip] */ }; obj.event += eh; obj.event -= eh; // option 2: inline declaration obj.event += (o, ea) => { /* [snip] */ }; 

将您的活动声明为

 public event Action e; 

然后你可以直接添加你的动作:

 Action a = something; e += a; 

您可以使用匿名方法:

 Event += (sender, e) => { // Multiple lines // of code here };