Wie kann man ein kurzes int-Literal ohne Casting angeben?


77

Gibt es eine Möglichkeit anzugeben, dass meine Variable ein kurzes int ist? Ich suche etwas Ähnliches wie das M-Suffix für Dezimalstellen. Für Dezimalstellen muss ich nicht sagen

var d = (decimal)1.23;

Ich kann einfach wie folgt schreiben:

var d = 1.23M;

Gibt es eine Möglichkeit, dies zu schreiben?

   var s  = SomeLiteralWithoutCast

so dass s impliziert ist, int kurz zu sein?


In dem Fall, den Sie erwähnen, würde dies den Typ ohne Grund verschleiern.
Harold


Wenn es eine Konstante ist, warum deklarieren Sie sie dann als Variable ? Variablen variieren, deshalb werden sie "Variablen" genannt; Konstanten nicht.
Eric Lippert

@ EricLippert Ich denke, er verwechselt "Konstante" mit "Literal".
Phoog

@EricLippert: Eigentlich meinte ich SomeLiteralWithoutCast. Ich habe meine Frage behoben.
Arne Lund

Antworten:


131

Kurze Antwort: Nein . In C # gibt es keinen Buchstaben S, der verwendet werden könnte, da var a = 123Sdies darauf hinweist, dass aes sich um einen Typ handelt short. Es gibt Lfür long, Ffür float, Dfür double, Mfür decimal, aber nichtS . Es wäre schön, wenn es das gäbe, aber das gibt es nicht.

var a = 1M;  // decimal
var a = 1L;  // long
var a = 1F;  // float
var a = 1D;  // double
var a = 1;   // int

var a = 1U;  // uint
var a = 1UL; // ulong

aber nicht

var a = 1S; // not possible, you must use (short)1;

25

Die Frage ist etwas verwirrend. Definieren wir einige Begriffe:

Ein konstanter Ausdruck ist (grob gesagt) ein Ausdruck, von dem der Compiler weiß, dass er ein bestimmter konstanter Wert ist.

Ein Literal ist eine bestimmte Art von konstantem Ausdruck; 123und Math.PIsind beide konstante Ausdrücke. Ersteres ist wörtlich, letzteres nicht.

Ein konstantes Feld ist ein Mitglied eines Typs, der mit einem konstanten Ausdruck initialisiert wird und dann an anderer Stelle als konstanter Ausdruck verwendet werden kann. Math.PIist ein Beispiel für ein konstantes Feld.

Eine lokale Konstante ist wie ein konstantes Feld, jedoch auf einen Block beschränkt. (So ​​wie eine lokale Variable auf einen Block beschränkt ist.)

Konstantenfelder und lokale Konstanten müssen ihren Typ explizit angeben. Es gibt keine "var" -Form für Konstanten. (Schon die Idee lässt einen schaudern; ein "const var" ist offensichtlich ein Oxymoron.)

Lokale Variablen müssen ihren Typ nicht angeben. Der Typ kann aus dem Initialisierer abgeleitet werden. Eine solche lokale Variable wird als "implizit typisierte lokale Variable" bezeichnet.

Ihre Frage lautet also: "Gibt es eine Möglichkeit, einen konstanten Literalausdruck vom Typ short zu schreiben, mit dem eine implizit typisierte lokale Variable vom Typ short initialisiert werden kann?"

Nein, da ist kein. Sie können die lokale Variable explizit eingeben:

short s1 = 123;

Sie können eine lokale Konstante explizit eingeben:

const short s2 = 123;

Oder Sie können einen konstanten Ausdruck erstellen, der eine kurze Besetzung enthält:

var s3 = (short)123;

Oder Sie können eine lokale oder Feldkonstante festlegen und ihren Namen für den Initialisierer des implizit eingegebenen lokalen verwenden:

var s4 = s2;

Aber daran führt kein Weg vorbei. shortmuss irgendwo erscheinen , entweder in einem Feld oder einer lokalen Deklaration oder in der Besetzung.


6
Warum gibt es kein Suffix für Kurzliteral?
Gdoron unterstützt Monica

1
@gdoron: Alle Funktionen sind standardmäßig nicht implementiert, bis jemand sie implementiert. Es gibt kein Suffix für Kurzliteral, da niemand diese Funktion jemals entworfen, implementiert, getestet und ausgeliefert hat. Genauer gesagt: warum sollte es das geben ? Was ist der überzeugende Vorteil eines Suffixes für ein kurzes Literal in C # 1.0 ? Das Fehlen eines Merkmals muss nicht begründet werden. Wenn Sie der Meinung sind, dass eine Funktion eine gute Idee ist, muss die Person, die die Funktion möchte , diese begründen. Was ist die Rechtfertigung?
Eric Lippert

5
@gdoron: Es gibt andere Begründungen als var. Sie haben beispielsweise zwei Methoden M (int) und M (kurz) und möchten einen Aufruf für die kurze Überladung erzwingen: M((short)123)jedoch ohne die Umwandlung. Der Vorteil der Eliminierung der Besetzung in diesem Szenario ist im Vergleich zu den Kosten gering. (Und in diesem Fall ist die Besetzung wohl besser, da es kristallklar macht, welche Überlastung genannt wird.)
Eric Lippert

16
@EricLippert Ich habe mich oft gefragt, warum das C # -Team Suffixe für einige numerische primitive Typen implementiert hat, für andere jedoch nicht.
James

4
Kurze Literale würden auch Code wie short x = y < 0 ? (short)0 : (short)ycleanner ( short x = y < 0 ? 0S : (short)y) machen
Clément

10

shortIn C # gibt es kein Suffix für den Datentyp. Wenn ein ganzzahliges Literal kurz sein soll, müssen Sie den Typ explizit angeben und ein Literal angeben, das sich im Bereich befindet.

short s = 123;

1
Er bat um eine Konstante , keine Variable.
Gdoron unterstützt Monica

4
@gdoron, ich bin anderer Meinung. Ich glaube, die Bedeutung bezog sich eher auf wörtliche Konstanten wie 1, 2 oder 3 und nicht auf eine Konstante im Sinne des Sprachkonstrukts const short foo = SOMEVALUE;. Betrachten Sie es im Kontext der Dezimalerklärungen und ich glaube, Sie werden zu dem gleichen Schluss kommen.
Anthony Pegram

Eric Lippert verstand wie ich ... siehe seinen Kommentar. =)
Gdoron unterstützt Monica

2
Er ist nicht unfehlbar (nur meistens), und vielleicht könnte die Aussprache verwirren, aber ich denke, die meisten Antworten (und die Stimmen!) Deuten darauf hin, dass mehr Menschen auf eine andere Bedeutung als geschlossen haben const.
Anthony Pegram

8

Zwei Optionen; weder ideal:

  1. Entfernen Sie das var, indem Sie den Typ explizit angeben :

    short s = 123;
    
  2. Verwenden Sie die Cast-Syntax (beachten Sie, dass dies eine Operation zur Kompilierungszeit und keine Laufzeit ist):

    var s = (short)123;
    

Dies ist die einzige Möglichkeit, einen wörtlichen Kurzschluss anzugeben.


1
Eigentlich bittet er um einen Const Short.
Gdoron unterstützt Monica

1
Warum ist die erste Option nicht ideal?
Gdoron unterstützt Monica

1
@ Gordon Ich meine: im Kontext der Operation nicht diese Syntax wollen, aber die Suffix-Syntax wie Dezimal (M) usw. wollen
Marc Gravell

@ Gordon, dass (const / not) die Syntax nicht ändert
Marc Gravell

2

Sie können Folgendes verwenden:

var value = (short)123;

Natürlich macht es keinen Sinn, da es bei var nicht darum geht, den Typ zu schreiben.


0

Es gibt so etwas nicht. Implicitly constSie müssen Ihre Konstante also so kurz definieren:

const short x = 999;

Sehen Sie hier mehr


2
könnte eine Idee sein, ihm eine Kennung zu geben. Dies wird nicht kompiliert.
Adam
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.