Comment comparer les valeurs de types génériques ?
Je l'ai réduit à un exemple minimal :
public class Foo where T : IComparable
{
private T _valeurMinimale = default(T);
public bool EstDansLaPlage(T valeur)
{
return (valeur >= _valeurMinimale); // <-- Erreur ici
}
}
L'erreur est la suivante :
L'opérateur '>=' ne peut pas être appliqué aux opérandes du type 'T' et 'T'.
Que se passe-t-il !? T
est déjà contraint à IComparable
, et même en le contraignant à des types de valeurs (where T: struct
), nous ne pouvons toujours pas appliquer les opérateurs <
, >
, <=
, >=
, ==
ou !=
. (Je sais qu'il existe des solutions de contournement impliquant Equals()
pour ==
et !=
, mais cela ne fonctionne pas pour les opérateurs relationnels).
Alors, deux questions :
- Pourquoi observons-nous ce comportement étrange ? Qu'est-ce qui nous empêche de comparer les valeurs de types génériques qui sont connus pour être
IComparable
? Cela ne va-t-il pas à l'encontre du but entier des contraintes génériques ? - Comment résoudre cela, ou du moins contourner le problème ?
(Je réalise qu'il existe déjà plusieurs questions liées à ce problème en apparence simple - mais aucun des fils de discussion ne donne de réponse exhaustive ou viable, donc en voici une nouvelle.)