2010-10-13 3 views
4

J'appelle un délégué et je ne suis pas très informé sur comment cela fonctionne et j'ai des erreurs de compilation à cause de cela (Erreur de compilation CS1660). Voici le code que j'ai pour cela:base.Invoke avec des délégués

base.Invoke(delegate { 
      bool flag = (((this.layerPickPlaceProcess != null) && (this.robotComponent != null)) && ((((StateEnum) this.layerPickPlaceProcess.State) == StateEnum.Idle) || (((StateEnum) this.layerPickPlaceProcess.State) == StateEnum.Ready))) && ((((StateEnum) this.robotComponent.State) == StateEnum.Idle) || (((StateEnum) this.robotComponent.State) == StateEnum.Ready)); 
      this.cmdManualPlace.Enabled = flag; 
     }); 
+0

Reflector est un outil qui vous montrera les assemblages décompilés - la technologie s'appelle ** réflexion **. – Oded

+0

Im familier avec réflecteur, mais pas avec les délégués et la réflexion n'a peut-être pas cracher le code correctement? – mookie

Répondre

6

ajouter (Action):

base.Invoke((Action)delegate { 
      bool flag = (((this.layerPickPlaceProcess != null) && (this.robotComponent != null)) && ((((StateEnum) this.layerPickPlaceProcess.State) == StateEnum.Idle) || (((StateEnum) this.layerPickPlaceProcess.State) == StateEnum.Ready))) && ((((StateEnum) this.robotComponent.State) == StateEnum.Idle) || (((StateEnum) this.robotComponent.State) == StateEnum.Ready)); 
      this.cmdManualPlace.Enabled = flag; 
     }); 

c'est parce que Invoke accepte Delegate qui n'est pas un délégué de type pour autant que le compilateur C# est concerné (sic!) . Un type de délégué doit définir une signature d'appel, alors que Delegate ne l'est pas et est simplement un ancêtre commun. L'expression delegate { ... } a le type ... essayez de deviner ... délégué anonyme (si c'était une méthode ce serait groupe de méthodes). Ce ne sont pas des types de délégués non plus! Mais ils peuvent être implicitement convertis en un type délégué qui a une signature correspondante. Et les types de délégué peuvent être implicitement convertis en Delegate.

Action est: public delegate void Action();

simplement, les chaînes:

  • Anonymous methodDelegate: aucune conversion existe
  • Anonymous methodAction: conversion implicite si signature correspond
  • ActionDelegate: conversion implicite (Action est un descendant de Delegate)

Combinez:

  • Anonymous methodActionDelegate: ça marche!
+0

J'ai besoin d'au moins un paramètre pour Action <>. Est-ce que j'ose essayer Action ? – mookie

+0

@mookie il y a un type de délégué 'Action' sans paramètres – Andrey

+0

Meilleure réponse jusqu'à présent. – Timwi

2

Essayez ceci:

// MethodInvoker is also acceptable. 
Action action = delegate 
     { 
      bool flag = (((this.layerPickPlaceProcess != null) && (this.robotComponent != null)) && ((((StateEnum) this.layerPickPlaceProcess.State) == StateEnum.Idle) || (((StateEnum) this.layerPickPlaceProcess.State) == StateEnum.Ready))) && ((((StateEnum) this.robotComponent.State) == StateEnum.Idle) || (((StateEnum) this.robotComponent.State) == StateEnum.Ready)); 
      this.cmdManualPlace.Enabled = flag; 
     }; 

base.Invoke(action); 

Vous devez dire complier un délégué de type spécifique à utiliser; Il peut y avoir n'importe quel nombre de types de délégué compatibles avec une méthode anonyme.

Vous pourriez trouver ce MSDN page utile, bien qu'il ne mentionne pas pourquoi le compilateur C# ne considère pas System.Delegate comme un type délégué, ce qui est le vrai problème ici.

+0

Pas mal, mais il serait bon de mentionner l'une des deux syntaxes qui permet d'écrire ceci dans une seule instruction sans variable temporaire. – Timwi