La mise en œuvre de l'arithmétique dans les génériques?
Est-il possible de mettre en œuvre l'arithmétique de base (au moins) en C# génériques, comme vous pouvez avec les modèles C++ ? J'ai essayé pendant un certain temps pour obtenir en place et fonctionne, mais le C# ne permet pas de déclarer le même type générique à plusieurs reprises, comme vous pouvez à l'aide de modèles.
Vaste recherche sur google n'a pas fourni une réponse.
EDIT: Merci, mais ce que je cherche est un moyen de faire de l'arithmétique au moment de la compilation, l'intégration de quelque chose comme l'Église des chiffres dans les génériques types. C'est pourquoi j'ai fait un lien de l'article que j'ai fait. L'arithmétique dans types génériques, pas de l'arithmétique sur les instances de types génériques.
Int32
, vous trouverez une IArithmetic<Int32>
interface dans la liste d'héritage qui est commenté. Ce n'est que pure spéculation de ma part mais si Microsoft a permis d'interface dans la BCL, alors vous pourriez peut-être préciser IArithmetic<T>
comme une contrainte pour vous permettre d'écrire vos propres classes génériques à l'arithmétique.Lien à la même question: stackoverflow.com/q/4039694/613130
OriginalL'auteur Thom Smith | 2012-06-08
Vous devez vous connecter pour publier un commentaire.
Malheureusement vous ne pouvez pas utiliser les opérations arithmétiques sur les types génériques
ne fonctionnera pas en c#!
Mais vous pouvez créer vos propres types numériques et de la surcharge des opérateurs (arithmétiques de l'égalité et de la
implicit
,explicit
). Cela vous permet de travailler avec eux dans un cadre tout à fait naturel. Cependant vous ne pouvez pas créer une hiérarchie d'héritage avec les génériques. Vous devrez utiliser un non générique de base de la classe ou de l'interface.Je l'ai fait avec un type de vecteur. Une version abrégée ici:
struct
contraintes ne sont pas autorisés"?Vous pouvez réellement. Voir Contraintes sur les Paramètres de Type (Guide de Programmation C#).
Les structures peuvent implémenter des interfaces! Depuis les structures ne peuvent hériter les uns des autres, de limiter à un certain type struct serait le même que celui de ne pas avoir un paramètre générique à tous (ou que vous auriez exactement un valide paramètre de type générique, à savoir cette une struct)!
Toutes mes excuses, je vais éditer mon commentaire précédent. Je ne pense pas que je serais jamais la peine avec un struct dans une interface, trop de manigances. Je n'étais pas trop réfléchir sur les spécificités de structs, c'était juste un commentaire en passant.
Ce que je veux dire est qu', vous pouvez restreindre le type générique d'une struct si elle implémente une interface.
where T : struct, INumber
OriginalL'auteur Olivier Jacot-Descombes
s'il vous Plaît n'hésitez pas à proposer plus de précisions si ma réponse semble hors déréglé.
Il n'existe pas de contraintes génériques sur les opérateurs du langage C#, au moins. Comme Jon Skeet a prouvé avec Sans Contrainte Mélodie, les contraintes qui pourraient en fait être parfaitement valable dans le CLR lui-même.
Le meilleur que vous pouvez faire avec des contraintes est de fournir des interfaces et des classes personnalisées qui exposent les actions dont vous avez besoin. Vous ne seriez pas en mesure de fournir les primitives (sauf si vous aussi mettre en œuvre les
implicit
opérateur peut-être), mais il serait au moins vous permettent de créer des génériques de code pour le calcul de la partie.Contraintes génériques qui permettent au compilateur de déduire la disposition des membres sur la base du plus petit dénominateur commun (comme spécifié par la contrainte ou l'absence de). La plupart du temps, les génériques sont sans contrainte et donc vous donner seulement
object
sémantique.Sinon, évitez d'utiliser des contraintes et de l'utilisation
dynamic
pour stocker temporairement le générique de la variable, puis faire l'hypothèse (via le duck-typing) qu'il dispose des opérateurs:Cela implique le DLR et aura des conséquences sur les performances (je n'ai pas les chiffres exacts), surtout si vous voulez les calculs à la performance est critique.
Je ne suis pas sûr de ce que vous voulez dire ", de déclarer le même type générique à plusieurs reprises", cela fonctionne:
OriginalL'auteur Adam Houldsworth
Amis, la réponse intuitive à ce en C# est RTTI et de la coulée arrière à partir de la classe de l'objet
tout d'abord, il va être lente, parce que vous êtes en train de faire RTTI et de la comparaison de chaînes. Deuxièmement, il n'est pas vraiment générique si je dois ajouter chaque type à la main...
Récemment, l'équipe a introduit d'optimisation de la détection typeof(T) et la suppression des branches mortes basé sur RTTI conditions. Cette solution, avec modifications, peut courir plus vite que les autres réponses.
OriginalL'auteur Sachin
oui, il peut être fait en utilisant la dynamique des variables de type.
exemple:
pour plus d'information, veuillez cliquez ici
OriginalL'auteur Ujjwal