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 (¿falta un reparto?)
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;?
El tipo de la expresión b == c ? 0 : 1 es int . Como se muestra en esta tabla , no hay una conversión implícita de int a uint , por lo que 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 de 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 long 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 uint válidos. 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 las permite.
Por cierto, si la parte b == c de su primer ejemplo se cambiara a una expresión constante (por ejemplo, true ), entonces toda la expresión del operador condicional sería una expresión constante y el código se compilaría.
Si b==c fuera una expresión constante, entonces todo el operador condicional se consideraría una expresión constante y, por lo tanto, se aplicaría la regla que permite convertir expresiones constantes de tipo int a otros tipos int y se compilaría.
Obviamente, b==c no es una expresión constante y, por lo tanto, el resultado del operador condicional no se puede conocer hasta el tiempo de ejecución, por lo que no se aplica la exención que permite una conversión implícita de ints a uint (para expresiones constantes).
En su variante if / else , ambas asignaciones reales son expresiones constantes.