C# - 为什么使用 EventHandler<T> 会出错?

C# - Why is there an error using EventHandler<T>?

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

关于这一点的错误信息:

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

错误信息:

Cannot implicity convert to type 'System.EventHandler<AB_Events.WorkPerformedEventArgs>' to '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();
    }
}

尽管方法和匿名函数可以隐式转换为与其签名匹配的委托类型,但是委托实例不能隐式转换为另一个 代表类型.

您需要使用 EventHandler<TEventArgs> 或您的 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 的签名将 return 类型更改为 void:

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

通常不建议从事件处理程序 return 无论如何,因为可以有多个订阅者。

我所做的是将 WorkPerformedHandler 替换为 EventHandler<WorkPerformedEventArgs>

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);