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?
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.
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
:
C # kurz / lang / int literales Format?
Sie müssen also Ihre int
explizit deklarieren:
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.
Ebenennummern wie 1
und 2
werden standardmäßig als Ganzzahlen behandelt, daher gibt ?:
eine int
zurück, die in short
konvertiert werden muss:
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%