2015-11-22 173 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