Format littéral C # court / long / int?

174

En C / C # / etc., vous pouvez dire au compilateur qu'un nombre littéral n'est pas ce qu'il semble être (c'est-à-dire floatau lieu de double, unsigned longau lieu de int:

var d = 1.0; // double
var f = 1.0f; // float
var u = 1UL; // unsigned long

etc.

Quelqu'un pourrait-il m'indiquer une liste de ceux-ci? Je recherche spécifiquement un suffixe pour shortou Int16.

3Dave
la source
duplication possible de Définition de différents types de nombres en C #
Daniel Renshaw
Parlez d'une vague de réponses ... Des votes positifs pour tout le monde.
3Dave

Réponses:

309
var d  = 1.0d;  // double
var d0 = 1.0;   // double
var d1 = 1e+3;  // double
var d2 = 1e-3;  // double
var f  = 1.0f;  // float
var m  = 1.0m;  // decimal
var i  = 1;     // int
var ui = 1U;    // uint
var ul = 1UL;   // ulong
var l  = 1L;    // long

Je pense que c'est tout ... il n'y a pas de spécificateurs littéraux pour short / ushort / byte / sbyte

Thomas Levesque
la source
10
Cela signifie-t-il que vous devez diffuser partout où vous utilisez short / ushort / byte / sbyte? Exemple: somebyte = somebool? (octet) 1: (octet) 0;
mola
3
@mola, oui, sauf si le type souhaité est sans ambiguïté (par exemple byte b = 42;)
Thomas Levesque
2
@molasomebyte = (byte)(somebool ? 1 : 0);
ou hor
2
Juste pour ajouter que les majuscules et les minuscules de ces suffixes littéraux sont équivalents, par exemple, 1let les 1Ldeux seront traités comme des entiers longs mais sont certainement 1Lplus lisibles que 1l.
RBT
1
@DzmitryLahoda que voulez-vous dire? Les suffixes abordés dans ce numéro ne sont pas encore implémentés.
Thomas Levesque
40

À partir du §2.4.4.2 Littéraux entiers :

Le type d'un littéral entier est déterminé comme suit:

  • Si le littéral n'a pas de suffixe, il a le premier de ces types dans lesquels sa valeur peut être représentée: int, uint, long, ulong.
  • Si le littéral est suffixé par Uou u, il a le premier de ces types dans lequel sa valeur peut être représentée: uint, ulong.
  • Si le littéral est suffixé par Lou l, il a le premier de ces types dans lequel sa valeur peut être représentée: long, ulong.
  • Si le littéral est suffixé par UL, Ul, uL, ul, LU, Lu, lU, ou lu, il est de type ulong.

Et à partir du §2.4.4.3 littéraux réels :

Si aucun suffixe de type réel n'est spécifié, le type du littéral réel est double. Sinon, le suffixe de type réel détermine le type du littéral réel, comme suit:

  • Un vrai littéral suffixé par Fou fest de type float. Par exemple, les littéraux 1f, 1.5f, 1e10fet 123.456Fsont tous de type float.
  • Un vrai littéral suffixé par Dou dest de type double. Par exemple, les littéraux 1d, 1.5d, 1e10det 123.456Dsont tous de typedouble.
  • Un vrai littéral suffixé par Mou mest de type decimal. Par exemple, les littéraux 1m, 1.5m, 1e10met 123.456Msont tous de type decimal. Ce littéral est converti en valeur décimale en prenant la valeur exacte et, si nécessaire, en arrondissant à la valeur représentable la plus proche en utilisant l'arrondi du banquier (section 4.1.7). Toute échelle apparente dans le littéral est conservée à moins que la valeur ne soit arrondie ou que la valeur soit zéro (dans ce dernier cas, le signe et l'échelle seront 0). Par conséquent, le littéral 2.900msera analysé pour former la décimale avec signe 0, coefficient 2900et échelle 3.
BoltClock
la source
9

Si votre variable n'est pas déjà courte, vous devez la caster explicitement:

Object s = (Int16) 1;
Chris
la source
5
Note latérale: je pense que cela provoque une conversion de boxe.
3Dave
6
Cela provoque la boxe car Int16 est un type valeur et Object est un type référence.
Scott Marcus
3

Il n'y en a pas un pour faire court. Utilisez simplement short s = 1;.

Aléatoire832
la source
2
Fait intéressant, cela compile: short z1 = (0 == 1 ? 0 : 1); Mais cela ne fonctionne pas: short y = 1; short z2 = (0 == 1 ? 0 : y);(désolé, pas de sauts de ligne autorisés dans les commentaires)
yoyo
3
@yoyo: C'est parce que le 0dans la branche if est converti en un int avant l'affectation à z2. Si vous utilisez deux shorts dans vos branches, le résultat sera à nouveau un short. Avec le if / else, le compilateur ne peut pas savoir que votre intpeut être représenté comme short.
Oliver