没有重载匹配委托 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
事件添加处理程序时,(在本例中,您调用 Knop
的 Button
),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.
你必须明确你的目标是什么。阐明需要编写哪些代码,以便我们为它建议合适的位置
我是一个初级程序员,试图掌握事件处理的细节。我正在为一个问题而烦恼。见下文:
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
事件添加处理程序时,(在本例中,您调用 Knop
的 Button
),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.
你必须明确你的目标是什么。阐明需要编写哪些代码,以便我们为它建议合适的位置