Méthodes génériques: réponse au quizz

Voici donc la réponse au post précédent sur les possibilités de déclarer des méthodes de signatures identiques dans une même classe. Il y a eu pas mal de solutions proposées. Voici celle qui a mon avis manquait. (vos critiques sont les bienvenues).

Alors voilà. Je voulais soulever le fait que depuis .Net 2.0, on peut créer des méthodes génériques.

Comme les classes partielles, ces méthodes sont définies à la compilation et ont donc bien une existance en IL. Les versions finales ou encore fermées (lorsque tous les paramètres génériques sont déterminés) ne sont compilées qu'au moment du JIT.

Il faut cependant se méfier de l'inférence de type et c'est sur ce point que je voulais attirer votre attention.

Imaginons une classe quelconque définissant la méthode suivante:

 void Toto<T>(T param)
{
    Console.WriteLine("generic version:" + param.ToString());
}

Le code appelant ressemble alors à:

 Toto<int>(12);

Mais attention car l'inférence permet d'écrire:

 Toto(12);

Qu'advient-il alors si on ajoute dans la même classe la méthode suivante de même signature ?

 void Toto(int i)
{
    Console.WriteLine(i);
}

C# n'aimant pas générer à l'exécution des exceptions dues à une non résolution du langage, un choix a été pris: c'est Toto(int i) qui est appelé.

Du coup, tous les appelants de Toto(12); appeleront désormais Toto(int i) et non Toto<int>(). Attention aux effets de bord !!!

Mitsu