Action <object,EventArgs>无法转换为EventHandler?

RCI*_*CIX 28 .net c# casting event-handling

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

Qry*_*taL 41

Action<Object, EventArgs> a = (o, ea) => { };
EventHandler e = a.Invoke;
Run Code Online (Sandbox Code Playgroud)

  • 这真的很聪明。 (3认同)

Bri*_*ian 38

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

EventHandler h = (o, ea) => { ... };
e += h;
...
e -= h;
Run Code Online (Sandbox Code Playgroud)

(如果它有帮助:

Action<object, EventArgs> a = (o, ea) => { }; 
EventHandler e = a;  // not allowed
EventHandler e2 = (o,ea) => a(o,ea);  // ok
Run Code Online (Sandbox Code Playgroud)

)

  • 我不是在推广e2作为编写代码的好方法,我只是用它作为一个例子来演示C#类型系统的合法性和不合法性. (3认同)
  • 它让我觉得有点傻,你无法从一个委托类型转换为另一个委托类型.这有什么好的理由吗? (3认同)
  • 除了 e2 现在通过两个函数调用来实际做任何事情...... eww。 (2认同)