Passer une méthode avec un paramètre à une méthode qui accepte un paramètre de type Action entraîne l'erreur de syntaxe
Impossible de convertir de "void" en "System.Action"
Cependant, si je lui passe une méthode qui n'a pas de paramètres, cela fonctionne bien.
Je suppose C#
fait quelque chose automatiquement quand je lui passe une méthode sans paramètre.
Je voudrais savoir ce qu'il fait en coulisses et comment faire de même avec une méthode qui a des paramètres.
public void Invoke(Action action){ /*Code Here */ }
public void Method1(){ /*Code Here */}
public void Method2(int param){ /*Code Here */ }
public void test()
{
int testParam = 1;
//** This works
Invoke(Method1);
//** This does not work
Invoke(Method2(testParam));
}
Votre méthode Invoke
attend un Action
mais vous essayez de lui transmettre la valeur de retour d'une méthode qui dans ce cas est void
. Au lieu de cela, vous pouvez utiliser un lambda pour créer le Action
:
Invoke(() => Method2(testParam));
Ou pour être plus explicite:
Action a = () => Method2(testParam);
Invoke(a);
La raison pour laquelle la première version fonctionne pour vous est que le passage d'une méthode sans suivi ()
est un raccourci pour le code ci-dessus. Ils sont donc équivalents:
Invoke(Method1);
Invoke(() => Method1());
Votre code ne fonctionne pas car Method2(testParam)
exécute la méthode, au lieu de fournir une action qui peut être exécutée à tout moment dans le futur.
Vous avez besoin d'un lambda ici:
Invoke(() => Method2(testParam));
L'autre code (Invoke(Method1)
) fonctionne car vous fournissez ici un délégué à la méthode (notez la parenthèse manquante: pas d'exécution, juste une référence à la méthode). Un délégué peut être converti en action.