Syntaxe des groupes de méthodes et invocation ambiguë avec surcharges de délégués
L'utilisation de la syntaxe de groupe de méthodes au lieu d'expressions lambda peut conduire à une ambiguïté lorsqu'il s'agit de méthodes surchargées acceptant des délégués Action
ou Func<string>
. Alors que les expressions lambda fonctionnent de manière transparente, les groupes de méthodes déclenchent une erreur « Invocation ambiguë ».
La nécessité d'un casting explicite : comprendre les règles de conversion
La cause première réside dans le groupe de méthodes de C# pour déléguer les règles de conversion. Un groupe de méthodes se convertit implicitement en un type délégué compatible, ce qui signifie que les types de paramètres et les modificateurs doivent correspondre. Surtout, le type de retour n'est pas pris en compte lors de cette conversion implicite.
Pendant la résolution de surcharge, le compilateur recherche les méthodes applicables. Une méthode est applicable si ses paramètres peuvent être implicitement convertis à partir des arguments fournis. Dans ce scénario, classWithSimpleMethods.GetString()
s'applique à à la fois Func<string>
et Action
car les listes de paramètres sont vides. Le compilateur ne peut pas choisir entre ces conversions également valables, d'où l'erreur d'ambiguïté. La conversion explicite du groupe de méthodes vers Action
ou Func<string>
résout ce problème.
C# 7.3 et au-delà : résolution de surcharge améliorée
Comme l'a noté Jon Skeet, C# 7.3 a introduit des améliorations dans la résolution des surcharges, atténuant ainsi cette ambiguïté. Dans de nombreux cas, le casting explicite n'est plus nécessaire avec C# 7.3 et les versions ultérieures.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!