[MSIL] surcharge de méthode avec même signature mais type de retour différents
En C# il n'est pas possible d'avoir deux méthodes ayant une signature identique qui différent seulement par le type de retour.
public class Foo
{
public int Bar()
{
return 0;
}
public String Bar()
{
return "pouet";
}
}
En MSIL c'est possible. Le code ci dessous compile parfaitement.
.assembly Foo{}
.module Foo.dll
.class public CFoo
{
.method public static int32 Bar()
{
ldc.i4.0
ret
}
.method public static string Bar()
{
ldstr "Toto"
ret
}
}
Lorsqu'on fait un appel de méthode en MSIL, on spécifie le nom complet de la méthode :
call int32 CFoo::Bar()
// ou
call string CFoo::Bar()
Que se passe t'il en C# ? Comment spécifier la méthode que l'on veut utiliser ?
L'IntelliSense de Visual Studio nous propose la méthode Bar qui retourne un String, mais si nous utilisons cette méthode.
Nous avons une erreur de la part de compilation :
J'ai essayé en castant la méthode (String)CFoo.Bar() mais même erreur. J'ai tenté VB, l'IntelliSense ne me propose même pas de méthode Bar.
Quelle est alors l'utilité de ce type de surcharge ? J'en ai trouvé qu'une seule, cela permet aux obfuscateurs de complexifier le code. En effet, si notre classe possède des méthodes GetPerson() et GetCompany() qui retournent respectivement une List<Person> et une List<Company>, un obfuscateur pourra utiliser le même nom pour renommer ces méthodes.
Est-ce que C# doit pouvoir utiliser/créer de tels surcharges ?
Techniquement, l'inférence de type nous permettrait de ne pas avoir trop d'ambigüité, si cela ne suffit pas on pourra toujours caster explicitement, afin de séléctionner la bonne méthode.
Conceptuellement, bien que dans certains cas cela puisse être utile, je ne pense pas que cela soit une bonne chose, cela risque de complexifier le code pour peu. L'utilisation des generics, nous permet dans la majorité des cas d'obtenir des solutions alternatives.
Et vous qu'en pensez vous ? Est-ce que le futur compilateur devra prendre ce cas en compte ?