2013-08-08 8 views
8

Ich habe den folgenden Code:werfen kurz in int wenn Block

Int16 myShortInt; 
myShortInt = Condition ? 1 :2; 

Dieser Code führt zu einem Compiler-Fehler:

cannot implicity convert type 'int' to 'short'

Wenn ich den Zustand, in dem erweiterten Format zu schreiben gibt es keine Compilerfehler:

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

Warum erhalte ich einen Compilerfehler?

Antwort

0

Wenn der Code kompiliert wird, sieht es so etwas wie folgt aus:

für:

Int16 myShortInt; 
myShortInt = Condition ? 1 :2; 

Es sieht ungefähr wie

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

während für:

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

Es gibt keine Stufe zwischen dem Wert als Int interperate und das Literal als Int16 behandelt wird.

+0

Ich vermute, der ternäre Operator ist generisch; etwas wie 'public T operator?: (bool Bedingung, T a, T b)' und der Compiler glaubt, dass 'T' in diesem Fall ein' int' ist, weil beide Eingaben 'int' sind. – Nolonar

7

Sie erhalten den Fehler, da wörtliche ganze Zahlen als int standardmäßig behandelt werden und int nicht implizit zu gieße short wegen Verlust an Präzision - daher der Compiler-Fehler. Zahlen mit einer Dezimalstelle wie 1.0 werden standardmäßig als double behandelt.

Diese Antwort Details, welche Modifikatoren für die Expression von verschiedenen Literale zur Verfügung stehen, aber leider kann man das nicht für short:

C# short/long/int literal format?

So werden Sie explizit werfen müssen, um Ihre int:

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

Oder:

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


Es gibt Fälle, wenn der Compiler dies für Sie tun können, wie eine wörtliche Integer-Wert zuweisen, der innerhalb eines short zu einem short passt:

myShortInt = 1; 

nicht sicher, warum das war nicht zu ternären verlängert Aktionen, hoffentlich kann jemand die Gründe dafür erklären.

+0

'leider kann man das nicht kurz machen 'Verdammt ... Ich war mir so sicher, dass es so etwas wie' 1s 'gab ... Na ja, +1 für die Antwort. – Nolonar

1

Flugzeug Zahlen wie 1 und 2 werden als ganze Zahlen standardmäßig behandelt, so dass Ihre ?: gibt ein int, die in short umgewandelt werden muss:

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

Sie schreiben können:

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

oder

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

aber, als Adam schon C beantwortet # betrachtet ganze Zahlenliterale als Ints außer in den Super einfachen Fällen wie dem Sie erklärte:

short x = 100; 
Verwandte Themen