一尘不染

当作为纯Delegate参数提供时,为什么必须强制转换lambda表达式

c#

采取方法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));

该方法何时需要普通代表?


阅读 219

收藏
2020-05-19

共1个答案

一尘不染

Lambda表达式可以转换为委托类型或表达式树-但是必须知道 哪种 委托类型。仅知道签名是不够的。例如,假设我有:

public delegate void Action1();
public delegate void Action2();

...

Delegate x = () => Console.WriteLine("hi");

您期望所指对象的具体类型x是什么?是的,编译器 可以 生成带有适当签名的新委托类型,但这很少有用,并且您进行错误检查的机会也会减少。

如果你想很容易地调用Control.InvokeAction最容易做的事情是添加扩展的方法来控制:

public static void Invoke(this Control control, Action action)
{
    control.Invoke((Delegate) action);
}
2020-05-19