我想在button_click函数中添加一个可选参数,以便我可以通过从另一个函数调用它来插入其他信息。
以下是代码:
private void button1_Click(object sender, EventArgs e, string bla = "")
{
if (bla.Length > 0)
{
MessageBox.Show(bla);
}
else
{
MessageBox.Show("Hi!");
}
}
private void button1_trigger()
{
button1_Click(null, null, "hi");
}
我从visual studio 2012获得的错误
答案 0 :(得分:4)
虽然看起来你的代码应该可行(最后一个参数是可选的,所以“button1_Click”仍然应该与委托匹配),但它并不是由于C#编译器的限制。也就是说,编译器无法将方法与委托(方法具有重载或可选参数)匹配。 (这是有充分理由的 - 你可能会认为优雅地处理这些案件会更复杂.Eric Lippert在他的博客上写过这个主题。)
我只想添加另一个适用于这两种情况的函数,并从处理程序中调用它:
private void trigger(object sender, EventArgs e, string bla = "")
{
if (bla.Length > 0)
{
MessageBox.Show(bla);
}
else
{
MessageBox.Show("Hi!");
}
}
private void button1_Click(object sender, EventArgs e)
{
trigger(sender, e);
}
private void button1_trigger()
{
trigger(null, null, "hi");
}
修改
因此,如果您不想因任何原因添加额外的函数,那么您可以使用lambda来添加处理程序:
this.button1.Click += (sender, args) => this.button1_Click(sender, args);
生成的编译代码实际上非常相似(我相信C#编译器会为匿名委托添加另一个成员函数),但这种语法肯定更紧凑。