c# - programacion - ¿Por qué?: ¿Causa un error de conversión mientras que si no lo hace?
que es if else en programacion (3)
Esta pregunta ya tiene una respuesta aquí:
Haciendo algunos cambios en el código, uso la siguiente línea:
uint a = b == c ? 0 : 1;
Visual Studio me muestra este error:
No se puede convertir implícitamente el tipo ''int'' a ''uint''. Existe una conversión explícita (¿te falta un yeso?)
Pero si uso el código:
uint a;
if (b == c)
a = 0;
else
a = 1;
Funciona correctamente sin ningún error o advertencia. ¿Por qué?
¿Por qué no puedo usar
uint a = b == c ? 0 : 1;
uint a = b == c ? 0 : 1;
?
El tipo de la expresión
b == c ? 0 : 1
b == c ? 0 : 1
es
int
.
Como se muestra en
esta tabla
, no hay conversión implícita de
int
a
uint
, por lo que esto no está permitido.
¿Por qué puedo usar
a = 0
?
Porque hay un tratamiento especial de los tipos numéricos cuando el valor es una expresión constante.
De la sección 6.1.9 de la especificación C #:
Una expresión constante de tipo int se puede convertir a tipo sbyte, byte, short, ushort, uint o ulong, siempre que el valor de la expresión constante esté dentro del rango del tipo de destino.
Una expresión constante de tipo largo se puede convertir a tipo ulong, siempre que el valor de la expresión constante no sea negativo.
Como se indica en la primera viñeta,
a = 0
y
a = 1
están permitidos porque
0
y
1
son expresiones constantes y son valores válidos de
uint
.
Básicamente, esto se reduce a que el compilador puede determinar fácilmente en el momento de la compilación que estas conversiones son válidas, por lo que les permite.
Por cierto, si la parte
b == c
de su primer ejemplo se cambiara a una expresión constante (por ejemplo,
true
), entonces la expresión del operador condicional completo sería una expresión constante y el código se compilaría.
Debe usar literals para que su código funcione correctamente de la siguiente manera:
uint a = b == c ? 0U : 1U;
Si
b==c
fuera una expresión constante, todo el operador condicional se consideraría una expresión constante y, por lo tanto, se aplicaría la regla que permite que las expresiones constantes de tipo
int
se conviertan en otros tipos int y se compile.
Obviamente,
b==c
no es una expresión constante y, por lo tanto, el resultado del operador condicional no puede conocerse hasta el tiempo de ejecución, por lo que la exención que permite una conversión implícita de ints a uint (para expresiones constantes) no se aplica.
En su variante
if
/
else
,
ambas
asignaciones reales son expresiones constantes.