2010-10-29 4 views
12

Sembra strano per me per essere colata null per un tipo così ho voluto di verificare che questo è il modo giusto per fare questo:È corretto eseguire il cast di null su nullable quando si utilizza l'espressione ternaria assegnando un tipo nullable?

decimal? d = data.isSpecified ? data.Value : (decimal?)null; 

alt text

alt text

NOTA: I sto segnando la risposta che suggerisce il metodo che personalmente mi piace di più:

decimal? d = data.isSpecified ? data.Value : default(decimal?) 
+1

Non è necessario il cast. 'decimal?' accetterà un null, direttamente. –

+0

aggiunto screenshot per riferimento. –

+6

@Robert Harvey, sei corretto che 'decimal?' Accetterà nulla, ma il compilatore deve essere in grado di determinare il tipo di ritorno dell'espressione ternaria, cosa che può fare solo se tu lanci null a 'decimal?'. –

risposta

17

Sì, va bene. Alternative:

condition ? (decimal?) value : null 

condition ? new decimal?(value) : null 

condition ? value : default(decimal?) 

condition ? value : new decimal?() 

Scegli quello che ritieni più leggibile.

Non c'è niente che puoi fare al di fuori dell'espressione stessa, poiché è il tipo di espressione che il compilatore non conosce. Ad esempio, mettere l'intera espressione tra parentesi e lanciarlo non sarebbe di aiuto.

+0

Funzionerebbe senza cast se 'value' fosse già' decimale? '? –

+0

@Robert: Sì, in tal caso andrebbe bene. Il problema è che il tipo dell'espressione condizionale * o * deve essere il tipo di LHS * o * il tipo di RHS ... e "null" non ha un tipo. –

2

Sì s, è perfettamente a posto.

1

È data.Value di tipo decimal? Se è così, ecco una notazione alternativa, senza il cast:

decimal? d = data.isSpecified ? new decimal?(data.Value) : null;