2012-02-16 12 views
14

Non riesco a capire il motivo per cui questo non funzioneràPerché non posso assegnare null al decimale con l'operatore ternario?

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) 
    ? decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) 
    : null; 
+2

Non siamo lettori della mente, cosa non funziona? –

+2

Si chiama operatore condizionale, non l'operatore ternario –

+0

@JakubKonecki sebbene sia chiaro. È sempre bene fornire quante più informazioni possibili. In questo caso un errore di compilazione –

risposta

34

Perché null è di tipo object (in modo efficace senza tipo) ed è necessario assegnarlo a un oggetto tipizzato.

questo dovrebbe funzionare:

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) 
     ? decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) 
     : (decimal?)null; 

o questo è un po 'meglio:

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) 
     ? decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) 
     : default(decimal?); 

ecco il link MSDN per la parola chiave default.

+0

Grazie mille. –

+1

fanbloodytastic! – northpole

+3

La risposta migliore è quella che non risponde, ma informa ed educa .. bello uno slugster –

2

È necessario lanciare la prima parte di decimal?

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) 
    ? (decimal?)decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) 
    : null; 
+1

Questo non farebbe differenza. Un 'decimale' può essere inserito in un' decimale? '. –

+0

"Il tipo di output dell'operatore ternario è il tipo della prima parte": questo non è vero ... può essere il tipo della prima o della seconda parte, a seconda delle conversioni esistenti tra loro –

+1

È possibile assegnare un 'decimale' in un' decimale? 'senza casting esplicito. – slugster

3
decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) ? 
          decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) : 
          (decimal?)null; 
5

Prova questo:

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) ? 
         decimal.Parse(txtLineCompRetAmt.Text.Replace(",", "")) : 
         (decimal?) null; 

Il il problema è che il compilatore non sa che tipo ha null. Quindi, si può solo gettarlo ai decimal?

3

Poiché il compilatore non può inferire il tipo migliore dagli operandi dell'operatore condizionale.

Quando si scrive condition ? a : b, ci deve essere una conversione implicita dal tipo di a al tipo di b, o dal tipo di b al tipo di a. Il compilatore dedurrà quindi il tipo dell'intera espressione come tipo di destinazione di questa conversione. Il fatto che lo si assegni a una variabile di tipo decimal? non viene mai considerato dal compilatore. Nel tuo caso, i tipi di a e b sono decimal e qualche riferimento sconosciuto o tipo nullable. Il compilatore non può indovinare quello che vuoi dire, quindi è necessario aiutarlo:

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) 
          ? decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) 
          : default(decimal?); 
6

Non utilizzare decimal.Parse.

Convert.ToDecimal restituirà 0 se viene fornita una stringa nulla. decimal.Parse genererà una ArgumentNullException se la stringa che si desidera analizzare è null.

Problemi correlati