J'ai remarqué quelques exemples de choses qui fonctionnent et qui ne fonctionnent pas avec les fonctions lambda et les délégués anonymes en C#. Que se passe t-il ici?Comment fonctionne le typage délégué/lambda et la coercition?
class Test : Control {
void testInvoke() {
// The best overloaded method match for 'Invoke' has some invalid arguments
Invoke(doSomething);
// Cannot convert anonymous method to type 'System.Delegate' because it is not a delegate type
Invoke(delegate { doSomething(); });
// OK
Invoke((Action)doSomething);
// OK
Invoke((Action)delegate { doSomething(); });
// Cannot convert lambda expression to type 'System.Delegate' because it is not a delegate type
Invoke(() => doSomething());
// OK
Invoke((Action)(() => doSomething()));
}
void testQueueUserWorkItem() {
// The best overloaded method match for 'QueueUserWorkItem' has some invalid arguments
ThreadPool.QueueUserWorkItem(doSomething);
// OK
ThreadPool.QueueUserWorkItem(delegate { doSomething(); });
// The best overloaded method match for 'QueueUserWorkItem' has some invalid arguments
ThreadPool.QueueUserWorkItem((Action)doSomething);
// No overload for 'doSomething' matches delegate 'WaitCallback'
ThreadPool.QueueUserWorkItem((WaitCallback)doSomething);
// OK
ThreadPool.QueueUserWorkItem((WaitCallback)delegate { doSomething(); });
// Delegate 'WaitCallback' does not take '0' arguments
ThreadPool.QueueUserWorkItem(() => doSomething());
// OK
ThreadPool.QueueUserWorkItem(state => doSomething());
}
void doSomething() {
// ...
}
}
Eh bien c'est beaucoup d'exemples. Je suppose que mes questions sont les suivantes:
Pourquoi
Invoke
refuse toujours une fonction lambda ou un délégué anonyme, maisThreadPool.QueueUserWorkItem
ne très bien?Que diable ne "Impossible de convertir la méthode anonyme pour taper 'System.Delegate' parce que ce n'est pas un type de délégué" signifie quand même?
Pourquoi
ThreadPool.QueueUserWorkItem
accepte un délégué anonyme sans paramètres, mais pas une expression lambda sans paramètre?
Et je pensais que je compris les délégués et les lambdas. J'étais tellement stupide. – recursive
Bonnes choses comme toujours, +1 pour "... est la seule caractéristique qu'ils ont les expressions lambda pas." – Ani
@recursive, si vous souhaitez en savoir plus, lisez les arbres d'expression. Ce qui est intéressant avec les expressions lambda, c'est qu'elles sont en réalité _expressions_, avec un modèle descriptif riche pour ce qui est exprimé, et pas simplement un raccourci syntaxique pour passer la logique à un paramètre délégué. C'est ce qui permet à la magie comme LINQ to SQL de se produire. http://msdn.microsoft.com/en-us/library/bb397951.aspx –