2013-08-08 14 views
8

Mam następujący kod:rzucić krótkie int, jeśli blok

Int16 myShortInt; 
myShortInt = Condition ? 1 :2; 

wyników tego kodu w błąd kompilatora:

cannot implicity convert type 'int' to 'short'

Gdybym napisać warunek w rozszerzonym formacie tam nie ma błąd kompilatora:

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

Dlaczego pojawia się błąd kompilatora?

Odpowiedz

0

Gdy kod jest skompilowany, wygląda mniej więcej tak:

dla:

Int16 myShortInt; 
myShortInt = Condition ? 1 :2; 

wygląda somthing jak

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

podczas gdy:

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

Nie ma stadium między do interperate wartość int i dosłownym jest traktowany jako INT16.

+0

Zgaduję, że operator trójskładnikowy jest ogólny; coś w stylu 'public T operator?: (bool condition, T a, T b)' i kompilator uważa, że ​​'T' w tym przypadku jest' int', ponieważ oba wejścia są 'int's. – Nolonar

7

Otrzymujesz błąd, ponieważ domyślne liczby całkowite są traktowane domyślnie jako int, a int nie jest domyślnie rzutowany na short z powodu utraty precyzji - stąd błąd kompilatora. Liczby z miejscem dziesiętnym, takie jak 1.0, są domyślnie traktowane jako double. Szczegóły

Ta odpowiedź co modyfikatory są dostępne dla wyrażania różnych literały, ale niestety nie można tego zrobić za short:

C# short/long/int literal format?

Więc trzeba będzie jednoznacznie oddać swój int:

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

Lub:

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


Istnieją przypadki, gdy kompilator może zrobić dla Ciebie, takie jak przypisanie dosłowną wartość całkowitą, która pasuje Wewnątrz short Do short:

myShortInt = 1; 

Nie wiem, dlaczego to nie zostało przedłużone do trójskładnikowego działania, miejmy nadzieję, że ktoś może wyjaśnić rozumowanie za tym.

+0

'niestety nie możesz tego zrobić w skrócie' Damnit ... Byłem pewien, że było coś takiego jak' 1s' na krótko ... No cóż, +1 za odpowiedź. – Nolonar

1

lotnicze numery jak 1 i 2 są traktowane jako liczby całkowite domyślnie, więc ?: zwraca int, który ma zostać przekształcony short:

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

można napisać:

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

lub

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

ale tak, jak Adam już odpowiedział C# uważa całe literały numer jako wskazówki z wyjątkiem w bardzo prostych przypadkach takich jak ten, który stwierdził:

short x = 100; 
Powiązane problemy