operator - string null c#
El tipo de expresión condicional no se puede determinar porque no hay una conversión implícita entre ''int'' y<null> (2)
La especificación (§7.14) dice que para la expresión condicional b ? x : y
b ? x : y
, hay tres posibilidades, ya sea y
ambos tienen un tipo y se cumplen ciertas buenas condiciones , solo uno de y
tiene un tipo y se cumplen ciertas buenas condiciones , o se produce un error en tiempo de compilación. Aquí, "ciertas buenas condiciones" significa que ciertas conversiones son posibles, lo cual entraremos en los detalles a continuación.
Ahora, pasemos a la parte pertinente de la especificación:
Si solo uno de
y
tiene un tipo, y tantox
comoy
son implícitamente convertibles a ese tipo, entonces ese es el tipo de expresión condicional.
El problema aquí es que en
int? number = true ? 5 : null;
solo uno de los resultados condicionales tiene un tipo. Aquí x
es un literal int
, y y
es null
que no tiene un tipo y null
no es implícitamente convertible a int
1 . Por lo tanto, "ciertas buenas condiciones" no se cumplen y se produce un error en tiempo de compilación.
Hay dos formas de evitar esto:
int? number = true ? (int?)5 : null;
Aquí todavía estamos en el caso donde solo uno de y
tiene un tipo. Tenga en cuenta que null
aún no tiene un tipo pero el compilador no tendrá ningún problema con esto porque (int?)5
y null
son ambos convertibles implícitamente a int?
(§6.1.4 y §6.1.5).
La otra forma es obviamente:
int? number = true ? 5 : (int?)null;
pero ahora tenemos que leer una cláusula diferente en la especificación para entender por qué está bien:
Si
x
tiene tipoX
ey
tiene tipoY
entonces
Si existe una conversión implícita (§6.1) de
X
aY
, pero no deY
aX
, entoncesY
es el tipo de expresión condicional.Si existe una conversión implícita (§6.1) de
Y
aX
, pero no deX
aY
, entoncesX
es el tipo de expresión condicional.De lo contrario, no se puede determinar ningún tipo de expresión y se produce un error en tiempo de compilación.
Aquí x
es de tipo int
y y
es de tipo int?
. No hay conversión implícita de int?
a int
, pero hay una conversión implícita de int
a int?
entonces el tipo de expresión es int?
.
1 : Note además que el tipo del lado izquierdo se ignora al determinar el tipo de expresión condicional, una fuente común de confusión aquí.
¿Por qué esto no compila?
int? number = true ? 5 : null;
El tipo de expresión condicional no se puede determinar porque no hay una conversión implícita entre ''int'' y <null>
null
no tiene ningún tipo identificable; solo necesita un poco de estímulo para hacerlo feliz:
int? number = true ? 5 : (int?)null;