Montag, Januar 27, 2020

Kann nicht implizit konvertiert Typ „long“ zu „int?“?

Es eine sehr einfache Frage – konvertiert einen Typ long-variable auf eine null-Datentyp int (int?). (siehe Beispiel weiter unten – nicht der eigentliche code)

int? y = 100;

long x = long.MaxValue;

y = x;

Bin ich immer der compile-Zeit-Fehler.

„Kann nicht implizit konvertiert Typ ‚long‘ in ‚int?‘. Eine explizite Konvertierung vorhanden ist (fehlt ein cast?).

Ich habe das Update ( siehe unten die Lösung Abschnitt), Meine Neugier bei der Buchung die Frage ist der 3 Lösungen, welche ist zu empfehlen?

Lösung

  y = Convert.ToInt32(x);
  y = (int)x;
  y = unchecked((int) x);  

Vielen Dank im Voraus für Eure Vorschläge

  • Wissen Sie, warum sich der compiler beschwert sich über das? Es wird versucht, Ihnen zu helfen.
  • David – ich bin völlig der Kenntnis von Verlust an Präzision ( verliert Wert), meine Frage war von den 3 was empfohlen wird( die oben ist nur ein Beispiel)
  • Welches ist empfehlenswert, hängt von Ihren Anforderungen ab.

2 Kommentare

  1. 3

    Grund benötigen Sie eine explizite Konvertierung ist, dass nicht alle Werte der long dargestellt werden kann, wie ein int. Der compiler ist mehr oder weniger sagt: „Sie kann dies tun, aber Sie müssen mir sagen, Sie wissen, was Sie tun‘.

    Pro die docs, Convert.ToInt32 zu überprüfen, und werfen ein OverflowException wenn die long dargestellt werden können als int. Sie können sehen, die Umsetzung in die reference source – es ist gerade diese prüfen und dann eine Besetzung.

    Den beiden letzten Optionen sind (meist) die gleichen und damit die Besetzung trotz überlauf als unchecked ist der compiler, der Standard. Wenn Sie den compiler standardmäßig aktiviert verwenden Sie die /checked-Schalter dann erhalten Sie eine OverflowException wenn nicht in einem unchecked block.

    Welcher ist der „beste“, es hängt davon ab, was Ihre Anforderung ist.

    • Die anderen beiden Optionen sind nicht das gleiche. Die erste wird eine exception werfen wenn kompiliert mit überlauf prüfen, und die zweite nicht.
    • ja. Das war irgendwie stillschweigend mit den Worten, es wurde die Standard-sowie die Anbindung an die docs, aber ich werde versuchen und machen Sie klarer.
  2. 4

    int 32-bit-integral während long ist 64-bit-integral.

    long können speichern/darstellen alle int Werte aber alle long Werte können nicht dargestellt werden durch int so long ist größer geben als int deshalb int werden können implizit in long durch den compiler, aber nicht Umgekehrt.

    So, dass ist der Grund, warum müssen wir explizit cast/convert long zu int die möglicherweise dazu führen, dass Informationen Verlust, wenn das long ist nicht darstellbar alsint

Kostenlose Online-Tests