Pourquoi les types de retour de méthodes génériques ne peuvent pas être déduits dans .NET
Dans .NET, les types de retour des méthodes génériques ne peuvent pas être déduits. Cette restriction est appliquée pour empêcher l'inférence de type de circuler « dans les deux sens » au sein d'une expression, ce qui peut conduire à des explosions combinatoires de combinaisons de types possibles.
Exemple
Considérez le méthode générique suivante :
static TDest Gimme<TSource, TDest>(TSource source) { return default(TDest); }
Si l'inférence du type de retour était autorisée, le code suivant serait valide :
string dest = Gimme(5);
Cependant, ce code entraînerait une erreur du compilateur car le type de retour de Gimme ne peut pas être déduit du type d'argument int.
Raisonnement
Le raisonnement derrière cette restriction est d'éviter les situations dans lesquelles les informations de type circulent à la fois de l'intérieur et de l'extérieur d'une expression. Considérez les scénarios suivants :
Scénario 1 : surcharges multiples
Supposons que nous ayons dix surcharges d'une méthode N avec différents types d'arguments. Si nous autorisions l'inférence du type de retour pour les méthodes génériques, nous aurions besoin de déduire le type de retour de G dans l'expression N(G(5)). Cela nécessiterait de considérer les dix surcharges de N et de sélectionner la « meilleure ». Cependant, les critères permettant de déterminer la « meilleure » surcharge seraient flous, ce qui entraînerait des ambiguïtés potentielles.
Scénario 2 : Expressions conditionnelles
Considérons l'expression double x = b ? G(5) : 123. Si l'inférence du type de retour était autorisée, nous aurions besoin de déterminer le type de retour de G en fonction du type de l'expression conditionnelle (double). Cependant, cela ne prendrait pas en compte la possibilité que le type de retour de G doive être implicitement convertible en type d'argument de l'expression conditionnelle (int).
Scénario 3 : Expressions imbriquées
Si nous combinons plusieurs expressions conditionnelles et appels de méthode, comme dans l'expression N(N(b ? G(5) * G("hello") : 123)), la complexité de l’inférence du type de retour augmente de façon exponentielle. Nous aurions besoin de considérer toutes les surcharges possibles de G et N en combinaison, conduisant à une explosion des combinaisons de types possibles.
Conclusion
En interdisant l'inférence de type de retour pour les méthodes, .NET empêche ces explosions combinatoires et garantit que l'inférence de type se déroule de manière prévisible et cohérente.
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!