我正在試驗多線程,當我資助一些我不能解釋的東西。下面的代碼編譯並沒有錯誤的工作原理:行動<T>之間的區別作爲參數和普通的lambda作爲參數
new Thread(() => Console.WriteLine("Hello")).Start();
而這一次沒有:
Action a =() => Console.WriteLine("World");
new Thread(a).Start();
爲什麼,什麼是這兩者之間的區別?
我正在試驗多線程,當我資助一些我不能解釋的東西。下面的代碼編譯並沒有錯誤的工作原理:行動<T>之間的區別作爲參數和普通的lambda作爲參數
new Thread(() => Console.WriteLine("Hello")).Start();
而這一次沒有:
Action a =() => Console.WriteLine("World");
new Thread(a).Start();
爲什麼,什麼是這兩者之間的區別?
Lambda可以轉換爲任意數量的可能的delegate
或表達式樹。 Action
是特定的委託類型。 Thread
沒有Constructor,特別是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返回類型的參數的委託,但事實並非如此。
在您的第一表達的拉姆達產生一個代表ThreadStart
,其中所述第二表達是Action
,且有ThreadStart
和Action
之間沒有轉換。
這將是你的第二個表達式的工作相當於:
ThreadStart a =() => Console.WriteLine("World");
new Thread(a).Start();