web-dev-qa-db-fra.com

impossible de convertir de «void» en «System.Action»

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));     
}
9
TheColonel26

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());
11
DavidG

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.

2
Patrick Hofman