web-dev-qa-db-fra.com

Comment définir la 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 class. Je sais que je peux définir un générique pour le type de classe comme ceci:

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

Je ne sais pas si c'est possible pour les types primitifs et comment.

60
David.Chu.ca

Vous pouvez l'utiliser pour le limiter aux types de valeur:

where C: struct

Vous mentionnez également la chaîne. Malheureusement, les chaînes ne seront pas autorisées car ce ne sont pas des types de valeur.

45
BFree

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 conseils utiles sur les exemples suivants définis pour la classe ValueType

17
Deko

Voici ce que vous recherchez:

T GetObject<T>() where T : struct;
14
Joshua Belden

Il n'y a aucune contrainte générique qui correspond à cet ensemble de choses proprement. Qu'est-ce que tu veux vraiment faire? Par exemple, vous pouvez le pirater avec des vérifications d'exécution, comme un ctor statique (pour les types génériques - pas si facile pour les méthodes génériques) ...

Pourtant; la plupart du temps, je vois cela, c'est parce que les gens veulent:

  • pour pouvoir vérifier l'égalité des éléments: dans ce cas, utilisez EqualityComparer<T>.Default
  • pour pouvoir comparer/trier les éléments: dans ce cas, utilisez Comparer<T>.Default
  • pour pouvoir effectuer l'arithmétique: dans ce cas, utilisez le support de MiscUtil pour opérateurs génériques
10
Marc Gravell

Qu'essayez-vous réellement de faire dans la méthode? Il se peut que vous ayez réellement 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
7
David McEwing