tag propiedad fuente documentar como codigo c# .net casting null

fuente - propiedad tag c#



¿Por qué null necesita un tipo explícito emitido aquí? (6)

Cuando utiliza el operador condicional con operandos de diferentes tipos, el compilador verificará si uno de los tipos puede convertirse implícitamente al otro tipo.

Si ninguno de los dos tipos puede convertirse implícitamente al otro, dará un error, incluso si hay un tercer tipo al que ambos pueden convertir implícitamente. El compilador no insertará una conversión implícita en ambos lados a la vez.

En su caso, tanto int como null requieren conversiones implícitas para convertirse en int? , por lo que no funciona.
¿Necesita cambiar su código para que un lado sea un int? y el otro lado puede convertirse implícitamente a int? . La forma más sencilla de hacer esto es reemplazar null con new int?() , Como esto:

int? b = (a != 0 ? a : new int?());

Esto solo requiere una conversión implícita ( int a int? ).

El siguiente código no se compila:

//int a = ... int? b = (int?) (a != 0 ? a : null);

Para compilar, necesita ser cambiado a

int? b = (a != 0 ? a : (int?) null);

Dado que tanto b = null como b = a son legales, esto no tiene sentido para mí.

¿Por qué tenemos que convertir el null en un int? y ¿por qué no podemos simplemente proporcionar un tipo explícito de conversión para toda la expresión (que sé que es posible en otros casos)?


Del capítulo 7.13 de la Especificación del lenguaje C #:

El segundo y tercer operandos del operador?: Controlan el tipo de la expresión condicional. Sean X e Y los tipos del segundo y tercer operandos. Entonces,

  • Si X e Y son del mismo tipo, entonces este es el tipo de la expresión condicional.
  • De lo contrario, 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.
  • De lo contrario, 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 compilación.

En su caso, no hay una conversión implícita de int a null ni al revés. Su elenco resuelve el problema, int es convertible a int?


Esto es prácticamente un duplicado de una de mis preguntas, con respecto al operador condicional. No es el nulo, realmente es el :

La respuesta aceptada allí es bastante buena, de parte de Eric Lippert, que está en el equipo del compilador de C #.


Las dos alternativas del operador ?: Deben ser del mismo tipo. De lo contrario, el compilador no puede deducir el tipo de la expresión condicional completa.

null no es un int , por lo que debe indicar al compilador que el tipo resultante es int? .

Edit: como los otros señalaron, los dos tipos no tienen que ser iguales, pero uno de ellos debe ser convertible en otro (ese otro será el tipo de resultado). Ver specs para más detalles.


Puede salvarse de la conversión si utiliza el default(int?) lugar de null .

int a = 42; int? b = (a != 0 ? a : default(int?));


es porque cuando se usa ese tipo de notación, ambos miembros deben ser del mismo tipo, por lo que debe decir explícitamente "¿este miembro es un int?".

Está limpio ?