Wird bei Blockierung kurz in int umgewandelt

8

Ich habe den folgenden Code:

%Vor%

Dieser Code führt zu einem Compilerfehler:

  

kann den Typ 'int' nicht in 'short' umwandeln

Wenn ich die Bedingung im erweiterten Format schreibe, gibt es keinen Compilerfehler:

%Vor%

Warum bekomme ich einen Compilerfehler?

    
Naphtali Davies 08.08.2013, 11:15
quelle

4 Antworten

0

Wenn der Code kompiliert wird, sieht das etwa so aus:

für:

%Vor%

Sieht ähnlich aus wie

%Vor%

während für:

%Vor%

Es gibt keine Stufe dazwischen, um den Wert als int zu interpretieren, und das Literal wird als Int16 behandelt.

    
Avi Turner 08.08.2013, 11:22
quelle
7

Sie erhalten den Fehler, weil Literal-Integer-Zahlen standardmäßig als int behandelt werden und int aufgrund von Genauigkeitsverlust nicht implizit in short umgewandelt wird - daher der Compiler-Fehler. Zahlen mit einer Dezimalstelle wie 1.0 werden standardmäßig als double behandelt.

Diese Antwort gibt detailliert an, welche Modifikatoren zum Ausdruck verschiedener Literale verfügbar sind, aber leider können Sie dies nicht für short :

tun

C # kurz / lang / int literales Format?

Sie müssen also Ihre int explizit deklarieren:

%Vor%

Oder:

%Vor%

Es gibt Fälle, in denen der Compiler dies für Sie tun kann, z. B. die Zuweisung eines literalen Ganzzahlwerts, der in ein short zu einem short passt: %Vor%

Nicht sicher, warum das nicht auf Ternäraktionen ausgedehnt wurde, hoffentlich kann jemand die Gründe dafür erklären.

    
Adam Houldsworth 08.08.2013 11:16
quelle
1

Ebenennummern wie 1 und 2 werden standardmäßig als Ganzzahlen behandelt, daher gibt ?: eine int zurück, die in short konvertiert werden muss:

%Vor%     
MarcinJuraszek 08.08.2013 11:16
quelle
0

Sie könnten schreiben:

%Vor%

oder

%Vor%

Aber ja, da Adam bereits geantwortet hat, betrachtet C # Ganzzahl-Literale als Ints, außer in den super einfachen Fällen wie dem, das Sie angegeben haben:

%Vor%     
Kevin DiTraglia 08.08.2013 11:17
quelle

Tags und Links