C# Language Inférence de type implicite (méthodes)


Exemple

Lors de la transmission d'arguments formels à une méthode générique, les arguments de type générique pertinents peuvent généralement être déduits implicitement. Si tous les types génériques peuvent être déduits, leur spécification dans la syntaxe est facultative.

Considérons la méthode générique suivante. Il a un paramètre formel et un paramètre de type générique. Il existe une relation très évidente entre eux - le type passé en argument au paramètre de type générique doit être le même que le type de compilation de l’argument passé au paramètre formel.

void M<T>(T obj)
{
}

Ces deux appels sont équivalents:

M<object>(new object());
M(new object());

Ces deux appels sont aussi équivalents:

M<string>("");
M("");

Et ainsi sont ces trois appels:

M<object>("");
M((object) "");
M("" as object);

Notez que si au moins un argument de type ne peut être déduit, tous doivent être spécifiés.

Considérons la méthode générique suivante. Le premier argument de type générique est le même que le type de l'argument formel. Mais il n'y a pas une telle relation pour le second argument de type générique. Par conséquent, le compilateur n'a aucun moyen d'inférer le deuxième argument de type générique dans aucun appel à cette méthode.

void X<T1, T2>(T1 obj)
{
}

Cela ne fonctionne plus:

X("");

Cela ne fonctionne pas non plus, car le compilateur ne sait pas si nous spécifions le premier ou le deuxième paramètre générique (les deux seraient valables comme object ):

X<object>("");

Nous sommes tenus de les taper tous les deux, comme ceci:

X<string, object>("");