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
ytiene un tipo, y tantoxcomoyson 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
xtiene tipoXeytiene tipoYentonces
Si existe una conversión implícita (§6.1) de
XaY, pero no deYaX, entoncesYes el tipo de expresión condicional.Si existe una conversión implícita (§6.1) de
YaX, pero no deXaY, entoncesXes 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;