【问题标题】:Action<object, EventArgs> could not be cast to EventHandler?Action<object, EventArgs> 无法转换为 EventHandler?
【发布时间】:2010-12-05 20:02:48
【问题描述】:

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

【问题讨论】:

    标签: c# .net event-handling casting


    【解决方案1】:

    将您的活动声明为

    public event Action<object, EventArgs> e;
    

    然后你可以直接添加你的action:

    Action<object, EventArgs> a = something;
    e += a;
    

    【讨论】:

      【解决方案2】:
      Action<Object, EventArgs> a = (o, ea) => { };
      EventHandler e = a.Invoke;
      

      【讨论】:

      • 这真是太聪明了。
      • 这应该是答案。不错!
      【解决方案3】:

      Lambda 可以隐式转换为具有正确形状的委托类型,但两个形状相同的委托类型不能隐式转换为彼此。只需将局部变量改为 EventHandler 类型即可。

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

      (如果有帮助的话:

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

      )

      【讨论】:

      • 除了 e2 现在通过两个函数调用来实际执行任何操作... eww.
      • @Matthew Scharley - 你测量过开销吗?
      • 您不能从一种委托类型转换为另一种等效的委托类型,这让我觉得有点傻。这有什么好的理由吗?
      • 关于对事件使用自定义委托类型是否有很大价值,请参阅stackoverflow.com/questions/1120506/…
      【解决方案4】:

      一般来说,委托不能被强制转换,因为它们没有定义哪些强制转换有效的继承树。为此,您有两种选择:

      1. 使用EventHandler 类型的变量而不是Action&lt;T1, T2&gt;
      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] */ };
        

      【讨论】:

      • 使用变量的全部意义在于,我可以在事件处理程序中删除事件,同时仍在事件内部。不过,+1。
      【解决方案5】:

      您可以改用匿名方法:

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

      【讨论】:

      • 这就是重点......我有一个设置只存储到一个变量中,我可以让事件在触发时自行删除,只是它不起作用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多