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

标签 c# events event-handling

制作 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();
    }
}

最佳答案

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

您需要使用 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委托(delegate),请确保将返回类型更改为 void根据 worker_WorkPerformed 的签名:

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

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

关于C# - 为什么使用 EventHandler<T> 会出现错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63129748/

相关文章:

c# - 事件 - 处理程序与直接访问?为什么?

javascript - JS - 强制打印死键

image - iTextSharp - 文本重叠图像

c# - 数据绑定(bind)到类

c# - 只读虚拟属性 - 无法更改其值

jquery - 监听文本框中的变化

java - 在 Java 中解析 EventBus 的不同值类型

javascript - 弹出窗口显示时的 ArcGis 4.0 Javascript API 事件

c# - 转换int吗?有条件地

c# - 在控制台中使用颜色,如何以简化的符号存储