2016-08-17 17 views

回答

4

Lambda可以轉換爲任意數量的可能的delegate或表達式樹。 Action特定的委託類型。 Thread沒有Constructor,特別是Action

這裏,具體來說,Lambda變成ThreadStart委託。

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返回類型的參數的委託,但事實並非如此。

1

在您的第一表達的拉姆達產生一個代表ThreadStart,其中所述第二表達是Action,且有ThreadStartAction之間沒有轉換。

這將是你的第二個表達式的工作相當於:

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