繁体   English   中英

C# - 为什么使用 EventHandler 时出错<t> ?</t>

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

做一个 Pluralsight 视频,找不到为什么不对。

关于这一点的错误消息:

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

错误信息:

无法将类型“System.EventHandler<AB_Events.WorkPerformedEventArgs>”隐式转换为“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委托执行 go,请确保根据worker_WorkPerformed的签名将返回类型更改为void

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM