new Thread(() => Console.WriteLine("Hello")).Start();
而这个没有:
Action a = () => Console.WriteLine("World");
new Thread(a).Start();
为什么,这两者有什么区别?
答案 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();
所以在第二种情况下,您已经说过"这是一个Action
"然后编译器找不到构造函数的重载,该重载采用Action
,然后产生编译器错误。
你可以说编译器可以自动注入刚刚转换过它的代码,因为它们都是没有带void返回类型参数的委托,但它没有。
答案 2 :(得分:1)
第一个表达式中的lambda产生ThreadStart
委托,其中第二个表达式为Action
,ThreadStart
和Action
之间没有转换。
这将是您的第二个表达式的等效工作:
ThreadStart a = () => Console.WriteLine("World");
new Thread(a).Start();