2009-12-05 5 views
1

Je possède ce code:Comment puis-je faire fonctionner ce lambda?

 String temp = txtForm.Rtf; 

     foreach (ReplaceStrut rs in replaceArray) { 
      temp = temp.Replace(rs.getNeedle(), rs.getReplacement()); 
     } 
     if (this.InvokeRequired) { 
      this.Invoke(temp => txtForm.Rtf = temp); 
     } else { 
      txtForm.Rtf = temp; 
     } 

Mais il ne compilera pas. Il se plaint de deux choses, "Impossible de convertir l'expression lambda en type 'System.Delegate' car ce n'est pas un type délégué" et, "Une variable locale nommée 'temp' ne peut pas être déclarée dans cette portée car elle donnerait une signification différente à 'temp', qui est déjà utilisé dans une portée 'parent ou current' pour désigner autre chose "

Les deux erreurs se trouvent sur la ligne lambda. Comment puis-je faire ce travail, qu'est-ce que je fais mal?

Répondre

5
this.Invoke(new Action(() => txtForm.Rtf = temp)) 
+0

Jamais vu la syntaxe utilisée comme ceci: p Je ne sais pas si je l'aime ou non. – leppie

+1

La nouvelle syntaxe Action (() => ...) 'est identique en termes d'IL générée à' (Action) (() => ...) '. –

0
this.Invoke((Action)() => txtForm.Rtf = something); // where something is free 
+1

cela ne fonctionne pas tout à fait. J'ai découvert que les lamba ont en fait accès aux variables de portée actuelles, donc le passage de temp est inutile. Fixe ta réponse et je la marquerai comme la bonne – Malfist

+0

Bon point :) Évidemment, il faudrait alors passer un argument: p – leppie

+0

Non, il faut utiliser temp, pas 'quelque chose' Quelque chose ne se trouve dans aucune des deux, c'est pourquoi Je devais être passé. – Malfist

6

L'erreur "ne peut convertir l'expression lambda de type 'System.Delegate' parce qu'il est pas un type de délégué" se produit parce que les expressions lambda ne sont pas les types. Le compilateur déduit généralement le type de la cible de l'affectation, mais ce n'est pas possible avec Invoke car il prend un System.Delegate. Casting l'expression lambda résoudra ce problème.

Il n'est pas nécessaire de déclarer temp comme paramètre de votre expression lambda. L'expression pourra faire référence à temp à partir de la portée contenant.

Changer votre Invoke ligne à la suivante et il devrait fonctionner:

this.Invoke((Action)(() => txtForm.Rtf = temp)); 

Assurez-vous que vous référencez l'ensemble System.Core pour la ligne ci-dessus, sinon vous obtiendrez une erreur « Utilisation du type générique ' System.Action 'nécessite' les arguments de type 1 ''.

+0

+1 pour l'explication – Davy8

Questions connexes