[英]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.