en C# cuando digo:¿Por qué C# trata 0 como int y no como short/decimal, etc.?
var s = 0;
lo que debería ser el tipo de s
? lo hace int32
. entonces parece que var
no se puede usar para tipos como short
y otros (?).
en C# cuando digo:¿Por qué C# trata 0 como int y no como short/decimal, etc.?
var s = 0;
lo que debería ser el tipo de s
? lo hace int32
. entonces parece que var
no se puede usar para tipos como short
y otros (?).
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;
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;
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
ou
, tiene el primero de estos tipos en que se puede representar su valor:uint
,ulong
.- Si el literal tiene el sufijo
L
ol
, 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
, olu
, que es de tipoulong
.
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
.
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;
Adrián, ese es un punto bastante bien explicado en la especificación, sin embargo. – Joey
Parece que no hay literal para abreviar :( – Dhananjay