2013-08-08 9 views
8

ho il seguente codice:gettato breve a int se blocco

Int16 myShortInt; 
myShortInt = Condition ? 1 :2; 

risultati questo codice in un errore di compilazione:

cannot implicity convert type 'int' to 'short'

Se scrivo la condizione in formato espanso non c'è errore del compilatore:

if(Condition) 
{ 
    myShortInt = 1; 
} 
else 
{ 
    myShortInt = 2; 
} 

Perché viene visualizzato un errore del compilatore?

risposta

0

Quando il codice viene compilato, sembra qualcosa di simile:

per:

Int16 myShortInt; 
myShortInt = Condition ? 1 :2; 

E sembra somthing come

Int16 myShortInt; 
var value = Condition ? 1 :2; //notice that this is interperted as an integer. 
myShortInt = value ; 

mentre per:

if(Condition) 
{ 
myShortInt = 1; 
} 
else 
{ 
myShortInt = 2; 
} 

Non c'è nessuna fase tra di interperate valore come int, e il letterale viene trattato come un Int16.

+0

Immagino che l'operatore ternario sia generico; qualcosa come 'operatore T pubblico?: (condizione bool, T a, T b)' e il compilatore crede che 'T' in questa istanza sia un' int', perché entrambi gli input sono 'int's. – Nolonar

7

viene visualizzato l'errore perché i numeri interi letterali vengono trattati come int di default e int non implicitamente in short a causa della perdita di precisione - da qui l'errore del compilatore. I numeri con una posizione decimale, ad esempio 1.0 vengono considerati come double per impostazione predefinita. dettagli

questa risposta cosa modificatori sono disponibili per esprimere diverse letterali, ma purtroppo non si può fare questo per short:

C# short/long/int literal format?

così hai bisogno di gettare in modo esplicito il vostro int:

myShortInt = Condition ? (short)1 :(short)2; 

oppure:

myShortInt = (short)(Condition ? 1 :2); 


Ci sono casi in cui il compilatore può fare questo per voi, come ad esempio l'assegnazione di un valore letterale intero che si inserisce all'interno di un short ad un short:

myShortInt = 1; 
Non

sicuro perché non è stato esteso a ternario azioni, si spera che qualcuno possa spiegare il ragionamento che sta dietro.

+0

'sfortunatamente non puoi farlo in breve 'Dannazione ... ero così sicuro che c'era qualcosa come' 1s' in breve ... Oh bene, +1 per la risposta. – Nolonar

1

numeri aereo come 1 e 2 sono trattati come numeri interi per impostazione predefinita, in modo che il ?: restituisce un int, che deve essere convertito in short:

Int16 myShortInt; 
myShortInt = (short)(Condition ? 1 :2); 
0

Si potrebbe scrivere:

Int16 myShortInt; 
myShortInt = Condition ? (short)1 : (short)2; 

oppure

myShortInt = (short) (Considiton ? 1 : 2); 

ma sì, come Adam già risposto C# considera letterali numeri interi come interi, tranne nei casi di super semplice come quello che ha affermato:

short x = 100; 
Problemi correlati