95 votes

Comment définir une limite de type générique aux types primitifs?

J'ai la méthode suivante avec un type générique:

 T GetValue<T>();
 

Je voudrais limiter T aux types primitifs tels que int, string, float mais pas le type de classe. Je sais que je peux définir un type de classe générique comme ceci:

 C GetObject<C>() where C: class;
 

Je ne suis pas sûr s'il est possible pour les types primitifs et comment si.

55voto

BFree Points 46421

Utilisez ceci:

 where C: struct
 

Cela le limitera aux types de valeur.

EDIT: Je viens de remarquer que vous mentionnez également string. Malheureusement, les chaînes ne seront pas autorisées car elles ne sont pas des types valeur.

30voto

Dejan Dimeski Points 1

En fait, cela fait le travail dans une certaine mesure:

 public T Object<T>() where T :
   struct, IComparable, IFormattable, IConvertible, IComparable<T>, IEquatable<T>
 

Pour limiter aux types numériques, vous pouvez obtenir des indications utiles sur les exemples suivants définis pour la classe ValueType .

18voto

Joshua Belden Points 3492

vous cherchez:

 T GetObject<T> where T: struct;
 

11voto

Marc Gravell Points 482669

Il n'y a pas de contrainte générique qui correspond à cet ensemble de choses proprement. Qu'est-ce que vous voulez vraiment faire? Par exemple, vous pouvez pirater autour de lui avec l'exécution des contrôles, tels que statique ctor (pour les types génériques - pas si facile pour les méthodes génériques)...

Cependant, la plupart des fois que je vois cela, c'est parce que les gens veulent un de:

  • pour être en mesure de vérifier les points suivants pour l'égalité: dans quels cas utiliser EqualityComparer<T>.Default
  • pour être en mesure de comparer, trier des éléments: dans quels cas utiliser Comparer<T>.Default
  • pour être en mesure d'effectuer l'arithmétique: dans quels cas utiliser MiscUtilsoutien pour les opérateurs génériques

9voto

David McEwing Points 3022

Qu'est-ce que vous essayez réellement de faire dans la méthode? Il se peut que vous ayez besoin de C pour implémenter IComparable ou une autre interface. Dans ce cas, vous voulez quelque chose comme

 T GetObject<T> where T: IComparable
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X