Frage

short s;
s = (EitherTrueOrFalse()) ? 0 : 1;

Dies scheitert mit:

Fehler CS0266: Der Typ 'int' kann nicht implizit in 'Short' konvertiert werden. Es gibt eine explizite Konvertierung (fehlt Ihnen eine Besetzung?)

Kann jemand erklären, warum das so ist? Das einzige, was ich mir vorstellen kann, ist, dass der Compiler den zweiten Wert nicht betrachtet und den Bereich zwischen den beiden nicht kennt, wenn ich so etwas wie geschrieben habe wie

short s;
s = (EitherTrueOrFalse()) ? 0 : 65000;

Richtig? Das einzige Fix ist mit einer hässlichen Besetzung?

Es scheint auch, dass C# kein Typ -Suffix für den kurzen Typ hat. Das ist eine ziemlich schwere Aufsicht imo. Ansonsten wäre das eine Lösung gewesen ...

War es hilfreich?

Lösung

Der Compiler hat eine implizite Konvertierung von a Konstante Ausdruck auf verschiedene primitive Typen (solange der Wert innerhalb des entsprechenden Bereichs liegt), aber hier ist der Ausdruck nicht konstant - er ist nur ein Int -Ausdruck. Es ist so ziemlich das gleiche wie:

short s;
s = CallSomeMethodReturningInt32();

Was den Compiler betrifft.

Es gibt zwei Optionen - Sie können den gesamten Ausdruck werfen oder jedes der beiden letztgenannten Operanden werfen:

short s = (EitherTrueOrFalse()) ? (short) 0 : (short) 1;

Um den Gesamtausdrucktyp zu machen short. In diesem speziellen Fall ist es schade, dass es kein numerisches wörtliches Suffix gibt, um a explizit a zu deklarieren short wörtlich. Anscheinend haben die Sprachdesigner dies in Betracht gezogen, waren jedoch der Meinung, dass es sich um eine relativ seltene Situation handelte. (Ich denke, ich würde wahrscheinlich zustimmen.)

Der Teil über implizite konstante Konvertierungen stammt aus dem Spezifikationsabschnitt C# 3.0 6.1.8:

6.1.8 Implizite Konvertierungen für Konstante Expression

Eine implizite Konstantkonvertierung ermöglicht die folgenden Konvertierungen:

  • EIN Konstantexpression (§7.18) vom Typ int kann konvertiert werden, um SByte zu tippen, byte, short, ushort, uint, oder ulong, bereitgestellt den Wert der Konstantexpression liegt im Bereich des Zieltyps.
  • EIN Konstantexpression vom Typ long Kann in Typ konvertiert werden ulong, bereitgestellt den Wert der Konstantexpressionist nicht negativ.

Andere Tipps

Weil die Die Besetzung erfolgt vom Compiler, nicht zur Laufzeit, ich würde es nicht als hässliche Besetzung bezeichnen, ich würde es eine komplizierte Syntax nennen:

s = (EitherTrueOrFalse()) ? (short)0 : (short)1;

Ich meine, so ist es in C#geschrieben, auch wenn es hässlich aussieht.

Sieh dir das an Blog -Artikel. Sehen Marc Gravells Antwort auf diese Frage.

Ich denke, das hat den gleichen Grund, warum dies nicht kompiliert wird:

short s1 = GetShort1();
short s2 = GetShort2();
short s3 = s1 + s2;

Dh, wenn kurz für etwas verwendet wird, wird es zu int befördert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top