Que manque-t-il aux generics ?
Les generics (apparus avec la version 2.0 du framework .NET), c'est beau, c'est super, ça permet de factoriser le code, d'assurer une vérification plus stricte par le compilateur, de s'éviter des casts partout, etc. etc. Bref, que du bonheur
J
Oui mais…
Je trouve que les contraintes que l’on peut mettre sur les generics sont très limitées :
- Forcer le type à être un type référence (where T : class)
- Forcer le type à être un type valeur (where T : struct)
- Forcer le type à être de type MyClass ou à en dériver (where T : MyClass)
- Forcer le type à implémenter une interface (where T : MyInterface)
- Forcer le type à dériver ou à implémenter un autre type (where T : K)
- Forcer le type à être une classe et posséder une méthode public new sans paramètres (where T : new())
Personnellement, j’aurais aimé pouvoir lui préciser :
- Lui préciser une signature de new (pas uniquement sans paramètre).
Ca éviterait de passer par le Activator.CreateInstance et permettrait de faire directement new T(…)
- Forcer le type à être une interface
Pour utiliser typeof(BLLT).GetInterfaceMap(typeof(IT))
- Forcer le type à ne pas être une classe abstraite
Dans le cas où le constructeur n’est pas public, la contrainte new ne marche pas (on peut d’ailleurs se demandait pourquoi dans le cas où la portée suffit). Avec Activator.CreateInstance, on a le droit d’instancier une classe même si son contructeur n’est pas public mais encore faut-il qu’elle ne soit pas abstraite.
- Enfin et c’est un peu plus vicieux, j’aimerais pouvoir lui dire que mon type générique hérite d’une classe C OU a définit la conversion implicite entre lui-même et C.
Dans cette optique, il est regrettable de ne pas pouvoir définir de conversion implicite sur une interface.
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :