簡體   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