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.
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.
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.