采取方法System.Windows.Forms.Control.Invoke(Delegate方法)
为什么会给出编译时错误:
string str = "woop"; Invoke(() => this.Text = str); // Error: Cannot convert lambda expression to type 'System.Delegate' // because it is not a delegate type
但这很好用:
string str = "woop"; Invoke((Action)(() => this.Text = str));
该方法何时需要普通代表?
Lambda表达式可以转换为委托类型或表达式树-但是必须知道 哪种 委托类型。仅知道签名是不够的。例如,假设我有:
public delegate void Action1(); public delegate void Action2(); ... Delegate x = () => Console.WriteLine("hi");
您期望所指对象的具体类型x是什么?是的,编译器 可以 生成带有适当签名的新委托类型,但这很少有用,并且您进行错误检查的机会也会减少。
x
如果你想很容易地调用Control.Invoke与Action最容易做的事情是添加扩展的方法来控制:
Control.Invoke
Action
public static void Invoke(this Control control, Action action) { control.Invoke((Delegate) action); }