El tipo de expresión condicional no se puede determinar porque no hay una conversión implícita entre ‘int’ y

¿Por qué esto no comstack?

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

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 comstackció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 tanto x como y 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 comstackció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 comstackdor 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 tipo X e y tiene tipo Y entonces

  • Si existe una conversión implícita (§6.1) de X a Y , pero no de Y a X , entonces Y es el tipo de expresión condicional.

  • Si existe una conversión implícita (§6.1) de Y a X , pero no de X a Y , entonces X 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 comstackció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í.

null no tiene ningún tipo identificable; solo necesita un poco de estímulo para hacerlo feliz:

 int? number = true ? 5 : (int?)null;