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);
正在制作 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);