Action <t>作为参数与普通lambda作为参数之间的区别

时间:2016-08-17 09:48:29

标签: c# lambda

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

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


而这个没有:

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

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

3 个答案:

答案 0 :(得分:4)

Lambda可以转换为任意数量的delegate个或表达式树。 Action特定的委托类型。 Thread的{​​{3}}没有明确接受Action

此处,具体而言,Lambda会变成ThreadStart委托。

答案 1 :(得分:2)

原因是Thread构造函数没有Action,需要ThreadStart代表。

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

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

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

所以在第二种情况下,您已经说过&#34;这是一个Action&#34;然后编译器找不到构造函数的重载,该重载采用Action,然后产生编译器错误。

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

答案 2 :(得分:1)

第一个表达式中的lambda产生ThreadStart委托,其中第二个表达式为ActionThreadStartAction之间没有转换。

这将是您的第二个表达式的等效工作:

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