2015-11-22 7 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)); 

выражение Лямбда не имеет тип, но он совместим с любым делегатом с соответствующими параметрами и возвращаемым типом. С другой стороны, типы делегатов неявно конвертируются друг в друга, но могут быть явно конвертированы, если они имеют совместимые подписи.

+0

Спасибо, последний комментарий имеет смысл. Ценить это. – loneshark99

Смежные вопросы