没有重载匹配委托 EventHandler,即使处理程序方法中的参数看起来很好

No overload matches delegate EventHandler, even though arguments in handler method seem fine

我是一个初级程序员,试图掌握事件处理的细节。我正在为一个问题而烦恼。见下文:

public class Knop_ClickEventArgs : System.EventArgs
{
  //Here comes code that still needs to be written.
}

static void Knop_Click(object sender, Knop_ClickEventArgs e)
{
    Canvas canvas = new Canvas();
    Application.Run(canvas);
}

public PromptScherm()
{
    //Deleted some code here that is most likely uninteresting

    Button Knop = new Button();

    // Deleted uninteresting code here as well

    this.Controls.Add(Knop);

    Knop.Click += Knop_Click;

}

这段(缩短的)代码给出了 CS0123 错误,描述了我的 Knop_Click 方法与委托 EventHandler.

不匹配

我已经确定问题出在 Knop_ClickEventArgs,因为如果我用 System.EventArgs 替换它,它就可以正常工作。但是,由于我在 Knop_ClickEventArgs 的定义中指定它是 System.EventArgs 的特定实例,我很困惑为什么会导致问题?

当您向控件的 Click 事件添加处理程序时,(在本例中,您调用 KnopButton),Button 将调用你的处理程序传递它 object sender, System.EventArgs e。这意味着:

  • 无法将您的处理程序定义为接受您自己的事件 class 而不是 System.EventArgs

  • 如果编译器允许你这样做,你就会遇到真正的麻烦,因为 Button 仍然会传递一个 System.EventArgs 给你的处理程序,完全无视你的意愿接收其他东西。

您计划向您的事件添加代码 class 告诉我您可能对事件和事件传递有一些不了解的地方。事件应该携带数据,它们不应该包含代码。

你完全错了。您只需要一个适当的事件处理程序附加到 Click 事件。

static void Knop_Click(object sender, EventArgs e)
{
}
// ...
Knop.Click += Knop_Click;

现在当 Button 触发 Click 事件时将调用此方法。您不能更改签名,因为这就是按钮触发此事件的方式。像这样。

Click.Invoke(this, EventArgs.Empty); // "this" refers to button it self.

现在在 Knop_Click 您收到 Button 刚刚传递给的参数。

static void Knop_Click(object sender, EventArgs e)
{ 
    var btn = (Button)sender;
    // do some logic.
}

现在,如果您更改签名,您希望发生什么?你想要的东西无法实现,因为 EventArgs 是基础 class,而 Button 正在传递 EventArgs,它无法转换为你的派生 class.

你必须明确你的目标是什么。阐明需要编写哪些代码,以便我们为它建议合适的位置