web-dev-qa-db-fra.com

Impossible de convertir le 'groupe de méthodes' en erreur 'System.Action <objet>'

J'ai créé la fonction suivante:

public void DelegatedCall(Action<Object> delegatedMethod)

Et défini la méthode suivante

public void foo1(String str) { }

Cependant, lorsque j'essaie d'appeler DelegateCall avec foo1:

DelegatedCall(foo1);

... J'obtiens l'erreur de compilation suivante:

Argument 1: cannot convert from 'method group' to 'System.Action<object>'

Quelle est la raison de cette erreur et comment puis-je la corriger? Malheureusement, le casting foo1 à Action n'est pas une option.

41
Jonathan

DelegatedCall attend un délégué qui prend tout object comme argument. Mais votre fonction foo1 que vous passez à DelegatedCall ne peut gérer qu'un argument string. Ainsi, la conversion n'est pas sécurisée par type et n'est donc pas possible.

Les paramètres d'entrée sont contre-variante, mais votre code a besoin covariance. (Voir Différence entre covariance et contre-variance .)

Vous pouvez rendre DelegatedCall générique:

DelegatedCall<T>(Action<T> action)

... ou demandez à n'importe quel délégué:

DelegatedCall(Delegate action)

Mais la mettre en œuvre est moche et nécessite une réflexion. Il ne vérifie pas non plus que la fonction n'a qu'un seul paramètre au moment de la compilation.

28
CodesInChaos

La variance ne fonctionne pas de cette façon; tu aurais besoin

DelegatedCall(obj => foo1((string)obj));

Comme même en 4.0, il ne croira pas que chaque objet est une chaîne.

Notez que si c'était foo1(object) et Action<string> (C'est-à-dire l'inverse) cela fonctionnerait probablement (en 4.0), puisque chaque chaîne est un objet.

10
Marc Gravell