为什么代码没有';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);
}

为什么代码没有';t编译

这是因为存在从具有正确签名的lambda到ThreadStart委托的隐式转换,而不是从Action委托到ThreadStart委托。但存在显式转换:

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

lambda表达式没有类型,但它与任何具有匹配参数和返回类型的委托都兼容。另一方面,委托类型不能隐式地相互转换,但如果它们具有兼容的签名,则可以显式转换。