Control.Invoke
接受Delegate
参数类型。Delegate
如果不告诉编译器我传递的是哪种类型的委托,我就无法将 Lamba 表达式作为 a传递。
textBox1.Invoke(() => { MessageBox.Show("Hello World"); }); //illegal
在这种情况下,我可以转换为Action
textBox1.Invoke((Action)(() => { MessageBox.Show("Hello World"); })); //legal
但是,我可以通过扩展方法创建一个速记方法(我见过 Marc Gravell 这样做):
public static void Invoke(this Control control, Action action)
{
control.Invoke((Delegate)action);
}
现在我的速记工作......
textBox1.Invoke(() => { MessageBox.Show("Hello World"); }); //legal
编译器如何确定匿名方法是扩展方法中的 Action,但编译器无法确定 Lamba 是 Action,因此Delegate
在 的情况下是合法的Control.Invoke
?