Делегаты WaitCallback и Action имеют одну и ту же подпись. Тем не менее, как доказательство кода ниже, они не могут рассматриваться как один и тот же тип.Почему нельзя использовать делегат Action <Object> в качестве WaitCallback для Threadpool?
static void Main(string[] args)
{
WaitCallback wcb = (o) => Console.WriteLine("Hello from wcb delegate");
ThreadPool.QueueUserWorkItem(wcb);//works
Action<object> action = (o) => Console.WriteLine("Hello from action<object> delegate");
ThreadPool.QueueUserWorkItem(action);//does not compile: Cannot convert from Action<object> to WaitCallback
Console.ReadLine();
}
У меня есть два вопроса по поводу этого наблюдения:
1) Почему это так, что делегаты с той же подписью, но с другим именем, не рассматриваются в качестве одного типа? Может ли команда дизайна языка выбрать по-другому или это могло бы привести к несоответствиям или другим проблемам?
2) Когда делегаты Action, где введены в .Net framework 2.0, WaitCallback уже существует. Интересно, было ли это не так, было ли оправдано введение дополнительного типа делегата WaitCallback вместо использования Action?
Спасибо, Хенк
Спасибо, Джои за ваш сложный ответ. Ваш способ формулировки дал мне больше информации о том, как работают делегаты. Ваше объяснение имен методов, именуемых делегатами, является отличным бонусом. – HenkGijsbert