为什么代码没有';t编译
本文关键字:编译 代码 为什么 | 更新日期: 2023-09-27 18:23:49
为什么代码在做同样的事情时不编译。
错误消息:
无法从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);
}
这是因为存在从具有正确签名的lambda到ThreadStart
委托的隐式转换,而不是从Action
委托到ThreadStart
委托。但存在显式转换:
Thread t = new Thread(new ThreadStart(action));
lambda表达式没有类型,但它与任何具有匹配参数和返回类型的委托都兼容。另一方面,委托类型不能隐式地相互转换,但如果它们具有兼容的签名,则可以显式转换。