2015-11-22 210 views
-2

爲什麼代碼不能編譯,當它做同樣的事情時。爲什麼代碼不能編譯

錯誤消息:

無法從System.Action轉換爲System.Threading.ThreadStart。

代碼:

// Compiles and works 
for (int i = 0; i < 100000; i++) 
{ 
    Thread t = new Thread(() => { 
     Console.WriteLine(Thread.CurrentThread.ManagedThreadId); 
     Thread.Sleep(100); Interlocked.Increment(ref Count); 
    }); 
    t.Start(); 
} 

// doesn't compile 
Action action =() => { 
    Console.WriteLine(Thread.CurrentThread.ManagedThreadId); 
    Thread.Sleep(100); 
    Interlocked.Increment(ref Count); 
}; 

for (int i = 0; i < 100000; i++) 
{ 
    Thread t = new Thread(action); 
} 
+2

你會得到什麼錯誤? –

+0

無法從System.Action轉換爲System.Threading.ThreadStart,但不是第一個做同樣的事情 – loneshark99

+0

我問的是,爲什麼編譯器不知道它具有相同的簽名,也就是說它沒有使用任何參數,不返回任何東西。不要這樣做,它隱含地像前一個 – loneshark99

回答

5

這是因爲沒有從正確的簽名拉姆達到ThreadStart代表的隱式轉換,而不是從一個Action委託一個ThreadStart委託。顯式轉換存在,但:

Thread t = new Thread(new ThreadStart(action)); 

lambda表達式沒有一個類型,但它與匹配參數和返回值類型的任何委託兼容。另一方面,委託類型不能隱式轉換爲對方,但如果它們具有兼容的簽名,則可以顯式轉換。

+0

謝謝,最後的意見是有道理的。欣賞它。 – loneshark99