2010-07-29 6 views
2

Quelqu'un peut-il nous dire pourquoi cette ligne de code ne compile pas? Il génère CS1660 à la place:Problème de compilation d'appel croisé

s.run_button.Invoke((b) => { b.Enabled = false; }, 
new object[] { s.run_button }); 

Visual Studio dit: Impossible de convertir l'expression lambda de type 'System.Delegate' parce qu'il est pas un type de délégué

Répondre

4

expressions Lambda par eux-mêmes aucun type et ne sont pas convertibles en System.Delegate. La méthode Invoke a le type System.Delegate et par conséquent il ne compilera pas car l'expression lambda n'a aucun type. Vous devez fournir une conversion de type explicite ici

s.run_button.Invoke(
    (Action<Button>)((b) => { b.Enabled = false; }), 
    new object[] { s.run_button }); 
2

La méthode Invoke prend un paramètre de type Delegate. Il a été écrit avant que les lambdas entrent dans notre monde. La solution la plus simple pour vous est d'envelopper votre lambda avec une action. Je ne suis pas sûr exactement quel type "b" est (et le compilateur C# non plus, d'où l'erreur), donc vous devrez le passer explicitement. Quelque chose comme:

s.run_button.Invoke(new Action<Button>(b => b.Enabled = false), new object[] { s.run_button }); 
+0

Merci, exactement ce dont j'avais besoin. – Segfault