制作 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/