Freigeben über


Integrierte numerische Konvertierungen (C#-Referenz)

C# stellt einen Satz integraler und gleitkommabasierter numerischer Typen bereit. Es gibt eine Konvertierung zwischen zwei numerischen Typen, entweder implizit oder explizit. Sie müssen einen Umwandlungsausdruck verwenden, um eine explizite Konvertierung auszuführen.

Implizite numerische Konvertierungen

Die folgende Tabelle zeigt die vordefinierten impliziten Konvertierungen zwischen den integrierten numerischen Typen:

Von Bis
sbyte short, int, long, float, , double, oder decimalnint
Byte short, ushort, intulonglonguint, float, , double, , oder nintdecimalnuint
kurze int, long, float, , doubleoder , oder decimalnint
ushort- int, uint, long, ulong, float, , doubleoder decimal, oder , nintoder nuint
int long, , float, doubleoder decimal, nint
long, ulong, float, , doubleoder , oder decimalnuint
lange float, doubleoder decimal
ulong float, doubleoder decimal
schweben double
nint long, float, double oder decimal
nuint ulong, float, double oder decimal

Hinweis

Die impliziten Konvertierungen von int, uint, long, ulong, nintoder in float und nuint von longulong, , nintoder nuint um einen double Verlust der Genauigkeit, aber niemals einen Verlust einer Größenordnung verursachen. Die anderen impliziten numerischen Konvertierungen verlieren nie Informationen.

Beachten Sie außerdem, dass

  • Jeder integrale numerische Typ ist implizit in einen numerischen Gleitkommatyp konvertierbar.

  • Es gibt keine impliziten Konvertierungen in die byte typen sbyte . Es gibt keine impliziten Konvertierungen aus den double Und-Typen decimal .

  • Es gibt keine impliziten Konvertierungen zwischen dem decimal Typ und den float Typen double .

  • Ein Wert eines konstanten Typausdrucks int (z. B. ein wert, der durch ein ganzzahliges Literal dargestellt wird) kann implizit in sbyte, , shortbyte, ushortuint, , ulong, , , nintoder , nuintwenn er sich im Bereich des Zieltyps befindet:

    byte a = 13;
    byte b = 300;  // CS0031: Constant value '300' cannot be converted to a 'byte'
    

    Wie im vorherigen Beispiel gezeigt, tritt ein Compilerfehler CS0031 auf, wenn sich der Konstantenwert nicht im Bereich des Zieltyps befindet.

Explizite numerische Konvertierungen

Die folgende Tabelle zeigt die vordefinierten expliziten Konvertierungen zwischen den integrierten numerischen Typen, für die keine implizite Konvertierung vorhanden ist:

Von Bis
sbyte byte, ushort, uint, ulong oder nuint
Byte sbyte
kurze sbyte, byte, ushort, uint, ulongoder nuint
ushort- sbyte, byteoder short
int sbyte, byte, short, ushort, , uint, oder ulongnuint
sbyte, byte, short, ushort, intoder nint
lange sbyte, byte, short, ushortintuint, , oder nintulongnuint
ulong sbyte, byte, short, ushortintuint, , oder nintlongnuint
schweben sbyte, byte, shortuintintushort, long, , ulong, , oder nintdecimalnuint
doppelt sbyte, byte, shortlongushortuintint, ulong, , , float, , decimal, , oder nintnuint
dezimal sbyte, byte, shortlongushortuintint, ulong, , , float, , double, , oder nintnuint
nint sbyte, , shortbyte, ushort, int, , uint, oder ulongnuint
nuint sbyte, , shortbyte, ushort, int, , uint, oder longnint

Hinweis

Eine explizite numerische Konvertierung kann zu Datenverlusten führen oder eine Ausnahme auslösen, in der Regel eine OverflowException.

Beachten Sie außerdem Folgendes:

  • Wenn Sie einen Wert eines integralen Typs in einen anderen integralen Typ konvertieren, hängt das Ergebnis vom Überlaufüberprüfungskontext ab. In einem überprüften Kontext ist die Konvertierung erfolgreich, wenn sich der Quellwert innerhalb des Bereichs des Zieltyps befindet. Andernfalls wird OverflowException ausgelöst. In einem deaktivierten Kontext ist die Konvertierung immer erfolgreich und wird wie folgt fortgesetzt:

    • Wenn der Quelltyp größer als der Zieltyp ist, wird der Quellwert abgeschnitten, indem die wichtigsten "zusätzlichen" Bits verworfen werden. Das Ergebnis wird dann als Wert des Zieltyps behandelt.

    • Wenn der Quelltyp kleiner als der Zieltyp ist, ist der Quellwert entweder mit einem Vorzeichen oder einer Null erweitert, sodass er dieselbe Größe wie der Zieltyp aufweist. Vorzeichenerweiterung wird verwendet, wenn der Quelltyp ein Vorzeichen hat; Nullerweiterung wird verwendet, wenn der Quelltyp kein Vorzeichen hat. Das Ergebnis wird dann als Wert des Zieltyps behandelt.

    • Wenn der Quelltyp die gleiche Größe wie der Zieltyp aufweist, wird der Quellwert als Wert des Zieltyps behandelt.

  • Wenn Sie einen decimal Wert in einen integralen Typ konvertieren, wird dieser Wert in Richtung Null auf den nächsten integralen Wert gerundet. Wenn sich der resultierende integrale Wert außerhalb des Bereichs des Zieltyps befindet, wird ein OverflowException Fehler ausgelöst.

  • Wenn Sie einen double oder float einen Wert in einen integralen Typ konvertieren, wird dieser Wert auf null auf den nächsten integralen Wert gerundet. Wenn sich der resultierende integrale Wert außerhalb des Bereichs des Zieltyps befindet, hängt das Ergebnis vom Kontext der Überlaufüberprüfung ab. In einem aktivierten Kontext wird ein OverflowException Fehler ausgelöst, während es sich in einem deaktivierten Kontext um einen nicht angegebenen Wert des Zieltyps handelt.

  • Beim Konvertieren in doublefloatwird der double Wert auf den nächsten float Wert gerundet. Wenn der double Wert zu klein oder zu groß ist, um in den float Typ einzupassen, ist das Ergebnis null oder unendlich.

  • Wenn Sie konvertieren float oder double in decimal, wird der Quellwert in Darstellung konvertiert und bei Bedarf auf die nächste Zahl nach der 28. Dezimalstelle gerundet decimal . Abhängig vom Wert des Quellwerts kann eines der folgenden Ergebnisse auftreten:

    • Wenn der Quellwert zu klein ist, um als ein decimalWert dargestellt zu werden, wird das Ergebnis null.

    • Wenn der Quellwert NaN (keine Zahl), Unendlichkeit oder zu groß ist, um als eine decimaldargestellt zu werden, wird ein OverflowException Wurf ausgelöst.

  • Wenn Sie in decimalfloat oder double, der Quellwert wird auf den nächstgelegenen float oder double Wert gerundet.

C#-Sprachspezifikation

Weitere Informationen finden Sie in den folgenden Abschnitten der C#-Sprachspezifikation:

Siehe auch