7
votes

Opérateurs de comparaison binaire sur des types génériques

J'ai une classe générique qui prend un type t . Dans cette classe, j'ai une méthode que j'ai besoin de comparer un type t à un autre type t tel que: xxx

l'opération de comparaison Intérieur de MyMethod échoue avec une erreur de compilateur CS0019 . Est-il possible d'ajouter une contrainte à t pour faire ce travail? J'ai essayé d'ajouter un où T: Icomarable à la définition de la classe en vain non.


1 commentaires

C'est impossible = (. Cependant, il y a une bibliothèque de mathématiques open source qui tente de le gérer, de rappeler le nom ...


5 Réponses :


3
votes

Non, il n'est pas possible, les contraintes de l'opérateur ne sont malheureusement pas autorisées dans C #. où T: Icomarable devrait fonctionner simplement bien, mais vous devez utiliser d'autres sémantiques: la méthode comparète au lieu de>,


3 commentaires

Oui et je ne suis pas sûr que l'OP soit marié à l'utilisation des opérateurs pour cela.


Hmm..Je n'ai pas vraiment compris votre commentaire.


Il voulait dire que l'OP n'est pas obligé d'utiliser ces opérateurs. Il peut utiliser n'importe quelle autre façon, Als Long est-il fonctionne.



9
votes

Ajout de contrainte pour vous assurer que le type implémente Icomarable est un moyen d'aller. Cependant, vous ne pouvez pas utiliser l'opérateur << / code> - l'interface fournit une méthode comparèteo pour faire la même chose: xxx

si vous aviez besoin d'autres Les opérateurs numériques que la simple comparaison, la situation est plus difficile, car vous ne pouvez pas ajouter de contrainte à la prise en charge par exemple + et il n'y a pas d'interface correspondante. Certaines idées sur ce peuvent être trouvés ici . < / p>


1 commentaires

Bon appel Tomas. J'ai trouvé un article de blog à blogs.telerik.com/hristoborisov/ Posts / 09-01-10 / ... concernant ce problème exact peu de temps après que j'ai posé la question qui confirme ce que vous dites.



2
votes

Vous devez utiliser icomparable 's comparèteo méthode.


0 commentaires

0
votes

Ce n'est pas directement possible, mais il y a des solutions de contournement.

J'ai posté la mienne dans une autre question ici.


0 commentaires

1
votes

En fait, vous n'avez besoin de rien de spécial ici. comparateur .default offre une méthode .Compare qui fera tout ce dont vous avez besoin sans nécessiter de contraintes génériques supplémentaires (qui tendent à se propager horriblement). Il fonctionne pour les deux icomparable et icomparable et prend en charge les classes, les structures et nullable . Travail fait.

Pour info, voilà comment le linq max / min implémentations fonctionne et également liste .sort . Donc une partie commune et bien soutenue de la BCL.


0 commentaires