2010-05-21 10 views
8

Un pequeño problema. ¿Alguna idea de por qué chicos esto no funciona?Cómo usar la operación condicional con Nullable Int

int? nullableIntVal = (this.Policy == null) ? null : 1; 

que estoy tratando de volver null si la expresión de la izquierda es cierto que los demás 1. Parece simple pero da error de compilación.

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

Si reemplazo el null en ? null : 1 con cualquier int válido, entonces no hay ningún problema.

Respuesta

20

Sí - el compilador no puede encontrar un tipo adecuado para la expresión condicional. Ignore el hecho de que lo está asignando a un int? - el compilador no usa esa información. Entonces la expresión es:

(this.Policy == null) ? null : 1; 

¿Cuál es el tipo de esta expresión? La especificación del lenguaje indica que debe ser el tipo del segundo operando o el del tercer operando. null no tiene ningún tipo, por lo que debería ser int (el tipo del tercer operando), pero no hay conversión de null a int, por lo que falla.

moldeada cualquiera de los operandos a int? y funcionará, o utilizar otra forma de expessing el valor nulo - por lo que cualquiera de estos:

(this.Policy == null) ? (int?) null : 1; 

(this.Policy == null) ? null : (int?) 1; 

(this.Policy == null) ? default(int?) : 1; 

(this.Policy == null) ? new int?() : 1; 

Estoy de acuerdo que es un ligero dolor que usted tiene que hacer esto .


Desde la sección de especificación del lenguaje C# 3.0 7.13:

El segundo y tercer operandos de la operador?: Controlar 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 condicional expresión.

  • lo contrario, si existe una conversión implícita (apartado 6.1) de X a Y, pero no de Y a X, entonces Y es el tipo de la expresión condicional.

  • lo contrario, si una conversión implícita (apartado 6.1) existe de Y a X, pero no de X a Y, entonces X es el tipo de la 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 .

+1

asquerosamente completo ... –

+0

increíblemente preciso y preciso. –

+0

@David: No era exhaustivo antes de tener la cita de la especificación del idioma. Me siento mejor al respecto ahora :) –

1

Esto funciona: int? nullableIntVal = (this.Policy == null) ? null : (int?)1;.

Razón (copiado de comentario):

mensaje

El error se debe a que las dos ramas de la ?: operador (null y 1) no tienen un tipo compatible. Las ramas de la nueva solución (usando null y (int?)1) sí.

+0

un int se lanzará implicitamente a int? - ¿el OP tiene problemas para asignar null al int? –

+0

El mensaje de error se debe a que las dos ramas del operador?: ('Null' y' 1') no tienen un tipo compatible. Las ramas de la nueva solución (usando 'null' y' (int?) 1') sí. –

+0

No creo que él quiera que sea simplemente 1 – KroaX

4

probar esto:

int? nullableIntVal = (this.Policy == null) ? (int?) null : 1; 
2

Tal vez usted podría intentar:

default(int?); 

en lugar de null

1

int? i = (verdadero? nuevo int?(): 1);

Cuestiones relacionadas