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