Action 无法转换为EventHandler?
我正在连接一个事件以使用一个lambda,它需要在触发后自行移除。 我无法通过将lambda内联到+ =事件(没有用于删除事件的可访问变量)来做到这一点所以我设置了一个Action
变量并将lambda移动到那里。 主要错误是它无法将Action
转换为EventHandler。 我认为lambda表达式可以隐式转换为事件处理程序,为什么这不起作用?
Lambdas可以隐式转换为具有正确形状的委托类型,但是两个相同形状的委托类型不能隐式地相互转换。 只需使局部变量具有类型EventHandler。
EventHandler h = (o, ea) => { ... }; e += h; ... e -= h;
(如果它有帮助:
Action
)
Action
通常,委托不能被强制转换,因为它们没有定义哪些强制转换有效的inheritance树。 为此,您有两个选择:
- 使用
EventHandler
类型的变量而不是Action
-
使用内联声明。
// 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
然后你可以直接添加你的动作:
Action
您可以使用匿名方法:
Event += (sender, e) => { // Multiple lines // of code here };