52 votes

Quelle est la "classe de base" pour les types de valeurs numériques en C# ?

Si je veux avoir une méthode qui prend n'importe quel type de nombre, existe-t-il une classe de base (ou un autre concept) que je peux utiliser ?

Pour autant que je sache, je dois créer des surcharges pour tous les différents types numériques (Int32, Int16, Byte, UInt32, Double, Float, Decimal, etc). Cela semble terriblement fastidieux. C'est soit ça, soit utiliser le type "objet" et lancer des exceptions s'ils ne sont pas convertibles ou assignables à un double - ce qui est plutôt mauvais car cela signifie qu'il n'y a pas de vérification à la compilation.

UPDATE : OK, merci pour les commentaires, vous avez raison Scarecrow et Marc, en fait, le fait de le déclarer comme Double fonctionne pour tous, sauf pour Decimal.

La réponse que je cherchais est donc Double - elle agit ici comme une classe de base puisque la plupart des types numériques lui sont assignables. (Je suppose que Decimal n'est pas assignable à Double, car il pourrait devenir trop grand).

public void TestFormatDollars() {
    int i = 5;
    string str = FormatDollars(i);   // this is OK
    byte b = 5;
    str = FormatDollars(b);     // this is OK
    decimal d = 5;
    str = FormatDollars(d);     // this does not compile - decimal is not assignable to double
}

public static string FormatDollars(double num) {
    return "$" + num;
}

1 votes

Quels types numériques ne sont pas assignables au double ? (Sauf pour les classes de grands nombres qui supportent des nombres arbitrairement grands)

1 votes

@scarecrow - decimal est un bit 96... beaucoup d'autres ne correspondent tout simplement pas à la gamme/échelle.

0 votes

Peut-être pourriez-vous préciser ce que vous voulez faire avec les chiffres à l'intérieur de la méthode ?

27voto

mike nelson Points 3819

La réponse est la suivante : il n'est pas nécessaire de fournir des surcharges pour TOUS les types numériques, mais seulement pour les types suivants Double y Décimal . Tous les autres (à l'exception peut-être de ceux qui sont exceptionnellement grands) seront automatiquement convertis dans ces formats.

Pas un classe de base mais en fait, c'était le hareng rouge. La classe de base System.ValueType n'aide pas beaucoup car elle inclut des types qui ne sont pas numériques. La référence de langage que je lisais est ce qui m'a embrouillé en premier lieu :)

(Je cherchais juste à qui attribuer la réponse et c'était une combinaison de Scarecrow et Marc Gravell, mais comme ils étaient des commentaires j'ai mis la réponse ici)

3 votes

En fait, cela donne des signatures de méthodes ambiguës. La surcharge de l'une d'entre elles fait l'affaire.

14voto

Marc Gravell Points 482669

Il n'y en a pas un (ou du moins, pas un que juste signifie "chiffres"). Vous pourriez utiliser :

void Foo<T>(T value) where T : struct {...}

Mais cela permet tout struct - pas seulement des chiffres. Si vous voulez faire de l'arithmétique, opérateurs génériques peuvent être utiles. Sinon, les surcharges sont l'option la plus viable.

1 votes

Le lien est rompu.

9voto

Dmitry Lobanov Points 2151

La réponse courte est : Les types numériques sont des types de valeurs, ils dérivent donc de System.ValueType. La réponse complète est : vous devriez lire ceci article de MSDN . De plus, je pense que vous devriez lire la référence du langage C# :). Le type de valeur n'est pas égal au type numérique, car les types de valeurs incluent également les structures et les énumérations.

1 votes

L'article de MSDN ne considère pas vraiment quel est le meilleur type à utiliser lorsque vous voulez qu'un paramètre prenne toutes sortes de nombres et rien d'autre - ce qui est ce que je demandais.

0 votes

Oui, mais l'article montre que le type décimal et les autres types à virgule flottante sont des types différents.

6voto

LukeH Points 110965

La classe de base des types numériques est ValueType .

Malheureusement, cela ne vous aidera toujours pas : DateTime , bool , Enum et des centaines d'autres types dérivent également de ValueType . Il n'y a pas NumericType classe de base dans .NET.

0 votes

Les types de valeurs ne sont pas nécessairement des nombres, n'est-ce pas ?

0 votes

Toutefois, ValueType comprend également les chaînes de caractères et d'autres types de valeurs non numériques.

0 votes

@Noldorin, Vous avez raison de dire que ValueType comprend des centaines de types non numériques, mais que String n'en fait pas partie. String est un type de référence (il se comporte juste un peu comme un type de valeur).

0voto

Greg B Points 6878

Les signatures de méthodes surchargées sont-elles hors de question ici ? Si vous voulez qu'un groupe contraint de méthodes effectue la même tâche, vous pouvez vider la méthode publique et appeler une méthode privée qui prend n'importe quel nombre en coulant l'entrée en un double.

1 votes

Officiellement, il s'agirait d'une conversion et non d'un moulage.

0 votes

Ce n'est pas impossible, c'est juste ennuyeux ! Puisqu'il y a beaucoup de types numériques. Cela semble être la meilleure solution mais je me demandais s'il n'y avait pas un meilleur moyen.

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