Le langage C# spécification décrit l'inférence de type dans la Section §7.5.2. Il y a un détail que je ne comprends pas. Considérons le cas suivant:
// declaration
void Method<T>(T obj, Func<string, T> func);
// call
Method("obj", s => (object) s);
Microsoft et Mono C# compilateurs de déduire correctement T
= object
, mais ma compréhension de l'algorithme dans le cahier des charges donnerait T
= string
, puis l'échec. Voici comment je comprends bien:
La première phase
-
Si Ei est une fonction anonyme, un paramètre explicite l'inférence de type (§7.5.2.7) est faite à partir de l'Ie à Ti
⇒ a aucun effet, parce que l'expression lambda n'a pas explicite des types de paramètres. Droit?
-
Si, au contraire, l'Ie a un type U et xi est un paramètre de valeur alors une limite inférieure de l'inférence est fabriqué à partir de U en Ti.
⇒ le premier paramètre est de type statique
string
, donc cela ajoute de lastring
à la baisse des valeurs limites pourT
, droite?
La deuxième phase
-
Toutes les interprétations variables de type Xi qui ne dépendent (§7.5.2.5) toutes les Xj sont fixes (§7.5.2.10).
⇒
T
est non fixée;T
ne dépend de rien... siT
devrait être fixé, à droite?
§7.5.2.11 de Fixation
-
L'ensemble des candidats types Uj commence comme l'ensemble de tous les types de l'ensemble de limites pour Xi.
⇒ {
string
(limite inférieure) } -
Ensuite, nous examinons chaque liés à Xi: [...] Pour chaque limite inférieure de l'U de Xi tous les types Uj qui, elle, n'est pas une conversion implicite de U sont retirés de l'ensemble candidat. [...]
⇒ ne pas enlever quoi que ce soit à partir de l'ensemble candidat, droite?
-
Si parmi les candidats restants types Uj il existe un unique type de V à partir de laquelle il y a une conversion implicite à tous les autres candidats types, alors Xi est fixé à V.
⇒ Car il n'y a qu'un seul candidat type, c'est vacuously vrai, alors Xi est fixé
string
. Droit?
Alors, où vais-je tort?