147 votes

Pourquoi je peux passer 1 comme une courte, mais pas la variable int j’ai ?

Pourquoi la première et la deuxième écriture fonctionne mais pas la dernière ? Est-il un moyen je peux permettre à tous les 3 d'entre eux et détecter si c’est 1, (int) 1 ou je suis passé à ? Et vraiment pourquoi on est autorisée mais la dernière ? La deuxième étant admise, mais pas les derniers vraiment souffle mon esprit.

Démo pour montrer l’erreur de compilation

186voto

CodesInChaos Points 60274

Les deux premiers sont des expressions constantes, le dernier ne l'est pas.

La spécification C# permet une conversion implicite de type int à court pour les constantes, mais pas pour d'autres expressions. C'est une règle raisonnable, puisque pour les constantes, le compilateur peut s'assurer que la valeur s'inscrit dans le type de cible, mais il ne peut pas normal expressions.

Cette règle est conforme à la directive que les conversions implicites doivent être sans perte.

6.1.8 Implicite de l'expression constante de conversions

Implicite de l'expression constante de conversion permet les conversions suivantes:

  • Une constante de l'expression (§7.18) de type int peuvent être convertis en type sbyte, byte, short, ushort, uintou ulong, à condition que la valeur de la constante d'expression est au sein de la gamme du type de destination.
  • Une constante est une expression de type long peuvent être convertis en type ulong, à condition que la valeur de la constante d'expression n'est pas négatif.

(Cité de la Spécification du Langage C# Version 3.0)

67voto

Konrad Rudolph Points 231505

Il n’y a pas de conversion implicite de à en raison de la possibilité de troncature. Toutefois, une expression de constante peuvent être traités comme ayant le type de cible le par le compilateur.

? Pas de problème : c’est clairement un valide valeur. ? Pas tellement-ça pourrait être une valeur > pour l’instance et le compilateur ne peut pas vérifier que dans le cas général.

8voto

Damien_The_Unbeliever Points 102139

un *littérale* peut être implicitement converti en [ ](http://msdn.microsoft.com/en-us/library/ybs77ex4%28v=vs.80%29.aspx). Considérant que :

Vous ne peut pas convertir implicitement des types numériques non littéraux dont de taille de stockage supérieure à court

Ainsi, les deux premiers travaillent parce que la conversion implicite des littéraux est autorisée.

6voto

Justin Points 2447

Je crois que c’est parce que vous êtes de passage dans un littéral/constant dans les deux premiers, mais il y a pas la conversion de type automatique lors du passage dans un entier dans la troisième.

Edit : Quelqu'un me battre pour elle !

3voto

Vishal Suthar Points 7442

Parce qu’il n’y aura aucune conversion implicite entre Nonliteral type à une plus grande taille courte.

La conversion implicite n’est possible pour l’expression de constante.

Lorsque que vous passez valeur en tant qu’argument à

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