【问题标题】:C# - Why is there an error using EventHandler<T>?C# - 为什么使用 EventHandler<T> 会出错?
【发布时间】:2020-07-28 08:13:03
【问题描述】:

制作 Pluralsight 视频,但找不到错误的原因。

关于这一点的错误信息:

worker.WorkPerformed += new EventHandler<WorkPerformedEventArgs>(worker_WorkPerformed);

错误信息:

不能隐式转换为类型 'System.EventHandler' 到 'AB_Events.WorkPerformedHandler'

片段

public delegate int WorkPerformedHandler(object sender,WorkPerformedEventArgs e);
public class Worker
{
    public event WorkPerformedHandler WorkPerformed;
    protected virtual void OnWorkPerformed(int hours, WorkType workType)
    {  
        var del = WorkPerformed as WorkPerformedHandler;
        if (del != null)
        {
            del(this, new WorkPerformedEventArgs(hours, workType));
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        var worker = new Worker();

        worker.WorkPerformed += new EventHandler<WorkPerformedEventArgs>(worker_WorkPerformed);

        Console.ReadKey();
    }

    public static void worker_WorkPerformed(object sender, WorkPerformedEventArgs e)
    {
        throw new NotImplementedException();
    }
}

【问题讨论】:

  • worker.WorkPerformed += worker_WorkPerformed; ?
  • Pluralsight 视频中的那个人让我像我一样,我想在这个方向上有一个方法
  • 我碰巧订阅了 PluralSight。你能分享你正在学习的课程的链接吗?
  • 模块 3,演示:实例化代表.. app.pluralsight.com/…

标签: c# events event-handling


【解决方案1】:

虽然方法和匿名函数可以隐式转换为与其签名匹配的委托类型,但委托实例不能隐式转换为另一个委托类型 em>。

您需要使用EventHandler&lt;TEventArgs&gt;WorkPerformedHandler,但不能同时使用:

public class Worker
{
    public event WorkPerformedHandler WorkPerformed;
    
    //...
}

或者:

public class Worker
{
    public event EventHandler<WorkPerformedEventArgs> WorkPerformed;
    
    //...
}

另外,因为worker_WorkPerformed 可以隐式转换为任一类型,所以最简洁的语法是这样的:

worker.WorkPerformed += worker_WorkPerformed; // Implicit conversion

如果您确实选择了 WorkPerformedHandler 代表,请确保根据 worker_WorkPerformed 的签名将返回类型更改为 void

public delegate void WorkPerformedHandler(object sender, WorkPerformedEventArgs e);

通常不建议从事件处理程序返回,因为可能有多个订阅者。

【讨论】:

    【解决方案2】:

    我所做的是将WorkPerformedHandler 替换为EventHandler&lt;WorkPerformedEventArgs&gt;

    public delegate int WorkPerformedHandler(object sender, WorkPerformedEventArgs e);
    public class Worker
    {
        public event EventHandler<WorkPerformedEventArgs> WorkPerformed;
        protected virtual void OnWorkPerformed(WorkPerformedEventArgs e)
        {
            WorkPerformed?.Invoke(this, e);
        }
    }
    

    活动订阅:

    var worker = new Worker();
    worker.WorkPerformed += new EventHandler<WorkPerformedEventArgs>(worker_WorkPerformed);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 2011-12-26
      • 1970-01-01
      • 2011-04-22
      • 1970-01-01
      相关资源
      最近更新 更多