2010-05-04 17 views
36

El código C# a continuación:¿Por qué no puedo establecer un int nullable en null en una declaración if ternaria?

int? i; 
i = (true ? null : 0); 

me da el error:

Type of conditional expression cannot be determined because there is no implicit conversion between '<null>' and 'int'

¿No debería ser válido? que me estoy perdiendo aqui?

+2

Este es un duplicado de http://stackoverflow.com/questions/2450866 que a su vez era un duplicado de http://stackoverflow.com/questions/858080. Consulte http://stackoverflow.com/questions/2215745/conditional-operator-cannot-cast-implicitly/2215959#2215959 para obtener un análisis del problema. –

Respuesta

81

El compilador intenta evaluar la expresión de la mano derecha. null es null y 0 es un int literal, no int?. El compilador intenta decirle que no puede determinar qué tipo debe evaluar la expresión. No hay conversión implícita entre null y int, de ahí el mensaje de error.

Debe indicar al compilador que la expresión debe evaluarse como int?. Hay una conversión implícita entre int? y int, o entre null y int?, por lo que cualquiera de éstos debería funcionar:

int? x = true ? (int?)null : 0; 

int? y = true ? null : (int?)0; 
1

La porción (true ? null : 0) convierte en una función de una manera. Esta función necesita un tipo de devolución. Cuando el compilador necesita averiguar el tipo de retorno, no puede.

Esto funciona:

int? i; 
i = (true ? null : (int?)0); 
13

Es necesario utilizar la palabra clave predeterminado() en lugar de nula cuando se trata de operadores ternarios.

Ejemplo:

int? i = (true ? default(int?) : 0); 

Alternativamente, sólo podría emitir el nulo:

int? i = (true ? (int?)null : 0); 

Personalmente me quedo con la notación default(), es sólo una preferencia, de verdad. Pero en última instancia, debe apegarse a una sola notación específica, en mi humilde opinión.

HTH!

Cuestiones relacionadas