avril
2007
Bien qu’on ait pu remarquer une forte amélioration de l’utilisation du compilateur C# avec le framework .Net 3.5, il n’en demeure pas moins que le compilateur est encore sous-exploité (du moins dans la CTP de Mars 2007). J’avais émis, dans mon article sur le sujet, un certain nombre de regret. Voici un exemple supplémentaire à mon sens bien regrettable :
{
}
public class C2
{
}
Je ne peux pas faire ceci :
{
}
public void Test<T>(T t) where T : C2
{
}
Pourtant la condition sur T est telle que le compilateur ne peut pas se tromper (car il n’y a pas de relation d’héritage entre C1 et C2). Cependant, ce code ne compile pas : « Type ‘ConsoleApplication1.Program’ already defines a member called ‘Test’ with the same parameter types ».
Dommage !
De plus, on aurait pu penser qu’en C# 3.0, on aurait le même résultat que pour les extension methods (voir mon article ou mon webcast sur le sujet). Peut-être pour la prochaine version…
Désolé je viens de m’apercevoir que j’avais loupé mon post précédent car il a supprimé tout ce qui était entre < et >. Il fallait lire ceci :
} <br />
<br />
public <T extends C2> void test(T t) { <br />
}
>> Je suppose que dans le cas de Test(c3) avec C3 qui hérite de C2 qui hérite de C2, il prend le Test(T t) where T : C2. Désolé, j’ai oublié la syntaxe java
Oui tout à fait, en fait les deux méthodes ont la signature suivante :
} <br />
<br />
public void test(C2 t) { <br />
}
Donc ensuite ce sont les règles de compilation « normale » qui sont pris en compte…
>> il fait comment lorsqu’on appelle Test avec une instance de C en paramètre ?
>> Pour info, le compilateur C# 3.0 ne compile pas dans le cas des extension methods.
En Java non plus, il génère une erreur du style : « the method test() is ambiguous for the type C ».
Il est alors neccessaire de caster afin que le compilateur puisse déterminer quel est la méthode à appeler :
Et c’est la même chose si on veut passer une référence null :
a++
pour .NET 3.5 c’est effectivement en CTP. J’ai du coup mis à jour mon post initial.
Petite question par rapport à Java :
Je suppose que dans le cas de
avec C3 qui hérite de C2 qui hérite de C2, il prend le
. Désolé, j’ai oublié la syntaxe java
C’est ce que fait le compilateur C#3.0 avec les extensions methods mais dans le cas d’une classe C qui implémente deux interfaces I1 et I2 et de deux méthodes
et
, il fait comment lorsqu’on appelle Test avec une instance de C en paramètre ?
Pour info, le compilateur C# 3.0 ne compile pas dans le cas des extension methods.
Alors la limitation est dommage en effet ! Mais bon le 3.5 est une version beta si je ne me trompe pas… donc cela peut changer d’ici la version finale.
A noter que c’est possible en Java avec les Generics (et même s’il y a une notion d’héritage entre C1 et C2) :
public void test(T t) {
}
public void test(T t) {
}
J’avais trop simplifié mon exemple et du coup, oui tu avais raison. C’est corrigé.
Le problème c’est qu’elles n’ont pas le même paramètre, dans un cas, c’est une instance de C1 ou d’une classe héritant de C1 et dans l’autre cas, c’est une instance de C2 ou d’une classe héritant de C2.
Salut,
Le problème ne viendrait pas du fait qu’il n’y a rien pour différencier les deux méthodes (même nom, « même paramètres ») ?
a++