2010-05-21 12 views
8

Un piccolo problema. Qualche idea ragazzi perché questo non funziona?Come utilizzare l'operazione condizionale con Nullable Int

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

Sto cercando di tornare null se l'espressione mano sinistra è True, altrimenti 1. Sembra semplice ma dà errore di compilazione.

Il tipo di espressione condizionale non può essere determinato perché non esiste una conversione implicita tra null e int.

Se sostituisco null in ? null : 1 con qualsiasi int valido, quindi non ci sono problemi.

risposta

20

Sì - il compilatore non riesce a trovare un tipo appropriato per l'espressione condizionale. Ignora il fatto che lo stai assegnando a un int? - il compilatore non usa queste informazioni. Quindi l'espressione è:

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

Qual è il tipo di questa espressione? Le specifiche del linguaggio indicano che deve essere il tipo del secondo operando o quello del terzo operando. null non ha alcun tipo, quindi dovrebbe essere int (il tipo del terzo operando) - ma non c'è conversione da null a int, quindi non riesce.

Fusioni uno dei due operandi per int? e funzionerà, o utilizzare un altro modo di expessing il valore nullo - in modo che qualsiasi di questi:

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

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

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

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

Sono d'accordo che è un leggero dolore che si deve fare questo .


Dalla C# 3.0 lingua specifica sezione 7.13:

Il secondo e terzo operandi del :? Operatore di controllo del tipo di espressione condizionale. Sia X e Y sia i tipi del secondo e terzo operando .Poi,

  • Se X e Y sono dello stesso tipo, allora questo è il tipo di condizionale espressione.

  • Altrimenti, se una conversione implicita (§6.1) esiste da X a Y, ma non da Y a X, allora Y è il tipo di espressione condizionale.

  • Altrimenti, se una conversione implicita (§6.1) esiste da Y a X, ma non da X a Y, allora X è il tipo di espressione condizionale.

  • In caso contrario, non è possibile determinare alcun tipo di espressione e si verifica un errore in fase di compilazione .

+1

disgustosamente comprensivo ... –

+0

incredibilmente preciso e accurato. –

+0

@David: non era completo prima che avessi la citazione dalle specifiche del linguaggio. Mi sento meglio ora :) –

1

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

Reason (copiato da commentare):

messaggio

L'errore è perché i due rami del ?: dell'operatore (null e 1) non hanno un tipo compatibile. I rami della nuova soluzione (usando null e (int?)1) fanno.

+0

un int eseguirà implicitamente il cast in int? - l'OP sta avendo problemi nell'assegnare null a int? –

+0

Il messaggio di errore è perché i due rami dell'operatore?: ('Null' e' 1') non hanno un tipo compatibile. I rami della nuova soluzione (usando 'null' e' (int?) 1') fanno. –

+0

Non penso che voglia che sia semplicemente 1 – KroaX

4

provare questo:

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

Forse si potrebbe provare:

default(int?); 

invece di null

1

int? i = (vero? nuovo int?(): 1);

Problemi correlati