动作之间的差异<;T>;作为参数,而普通lambda作为参数

本文关键字:参数 lambda 之间 lt gt | 更新日期: 2023-09-27 18:02:40

当我资助一些我无法解释的事情时,我正在尝试多线程。以下代码编译并工作无错误:

new Thread(() => Console.WriteLine("Hello")).Start();


而这个没有:

Action a = () => Console.WriteLine("World");
new Thread(a).Start();

为什么,这两者之间有什么区别?

动作之间的差异<;T>;作为参数,而普通lambda作为参数

Lambda可以转换为任意数量的可能的delegate或表达式树。Action特定的委托类型。Thread没有接受Action的构造函数。

这里,具体地,Lambda被转变为ThreadStart委托。

原因是Thread构造函数不接受Action,而是接受ThreadStart委托。

当您使用lambda表达式时,编译器将推断出适合您的类型,这意味着这两段代码如下所示:

new Thread(new ThreadStart(() => Console.WriteLine("Hello"))).Start();

Action a = new Action(() => Console.WriteLine("World"));
new Thread(a).Start();

因此,在第二种情况下,你说"这是一个Action",然后编译器不会找到采用Action的构造函数的重载,然后产生编译器错误。

你可以说编译器可以自动注入刚刚转换的代码,因为它们都是没有参数的委托,返回类型为void,但事实并非如此。

第一个表达式中的lambda生成一个ThreadStart委托,其中第二个表达式是Action,并且ThreadStartAction之间没有转换。

这将是你的第二个表达式的工作等价物:

ThreadStart a = () => Console.WriteLine("World");
new Thread(a).Start();