2012-03-15 9 views

Respuesta

3

De la especificación (§ 2.4.4.2):

Si el literal no tiene sufijo, que tiene el primero de este tipo en el que su valor se puede representar: int, uint, long, ulong.

Así que los tipos más pequeños no se deducen automáticamente. Puede añadir un molde para forzar un tipo más pequeño ejemplo:

var s = (short)0; 
+0

, entonces es bueno escribir abreviado s = 0; al menos, es una versión más corta. – Dhananjay

+0

Sí, puede. Pero probablemente ya lo sabía. Tengo la impresión de que su confusión proviene de por qué el compilador no tratará '0' como corto automáticamente. – Joey

2

El compilador de C# infiere el tipo de ser Int32. Y no puede convertirlo implícitamente en short o byte porque son más pequeños y podría perder datos.

Si desea que el compilador inferir decimal puede:

var s = 0M; 
5

De acuerdo con el estándar del lenguaje C#, específicamente §2.4.4.2 on integer literals:

El tipo de un literal entero se determina como sigue :

  • Si el literal no tiene sufijo, tiene el primero de estos tipos en el que se puede representar su valor ted: int, uint, long, ulong.
  • Si el literal tiene el sufijo U o u, tiene el primero de estos tipos en que se puede representar su valor: uint, ulong.
  • Si el literal tiene el sufijo L o l, tiene el primero de estos tipos en que se puede representar su valor: long, ulong.
  • Si el literal es el sufijo UL, Ul, uL, ul, LU, Lu, lU, o lu, que es de tipo ulong.

La primera regla es todo lo que debe aplicarse aquí. El literal 0 no tiene sufijo y se puede representar como tipo int (o, en términos de BCL, Int32), así que ese es el tipo que tiene.

Como puede deducir de lo anterior, para cambiar el tipo de un literal, puede agregarle un sufijo. Por ejemplo, el literal 0u será del tipo uint.Alternativamente, podría convertir explícitamente el literal a un tipo diferente; por ejemplo: (short)0 haría que el compilador tratara el literal como short.

5

Mira esta publicación here en StackOverflow.

Puede especificar un sufijo para todos los números.

var i = 0; 
var d = 0d; 
var f = 0f; 
var l = 0L; 
var m = 0m; 
Cuestiones relacionadas