Integrierte numerische Konvertierungen (C#-Referenz)

C# bietet eine Reihe von integralen numerischen Typen und numerischen Gleitkommatypen. Es gibt eine Konvertierung zwischen zwei beliebigen numerischen Typen, entweder implizit oder explizit. Sie müssen einen Cast-Ausdruck verwenden, um eine explizite Konvertierung durchzuführen.

Implizite numerische Konvertierungen

Folgende Tabelle veranschaulicht vordefinierte implizite Konvertierungen zwischen integrierten numerischen Typen:

Von Beschreibung
sbyte short, int, long, float, double, decimal oder nint
byte short, ushort, int, uint, long, ulong, float, double, decimal, nint oder nuint
short int, long, float, double oder decimal oder nint
ushort int, uint, long, ulong, float, double oder decimal, nint oder nuint
int long, float, double oder decimal, nint
uint long, ulong, float, double oder decimal oder nuint
long float, doubleoder decimal
ulong float, doubleoder decimal
float double
nint long, float, doubleoder decimal
nuint ulong, float, doubleoder decimal

Hinweis

Die impliziten Konvertierungen aus int, uint, long, ulong, nint oder nuint in float und aus long, ulong, nint oder nuint in double können einen Verlust an Genauigkeit verursachen, aber niemals einen Verlust in einer Größenordnung. Die anderen impliziten numerischen Konvertierungen verlieren nie Informationen.

Beachten Sie außerdem:

  • Jeder integrale numerische Typ ist implizit in jeden numerischen Gleitkommatypen konvertierbar.

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

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

  • Ein Wert eines konstanten Ausdrucks vom Typ int (z. B. ein Wert, der durch ein ganzzahliges Literal dargestellt wird), kann implizit in sbyte, byte, short, ushort, uint, ulong, nint oder nuint konvertiert werden, wenn er sich im Bereich des Zieltyps befindet:

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

    Wie das vorherige Beispiel zeigt, tritt der Compilerfehler CS0031 auf, wenn der konstante Wert nicht innerhalb des Bereichs des Zieltyps liegt.

Explizite numerische Konvertierungen

Folgende Tabelle veranschaulicht vordefinierte explizite Konvertierungen zwischen integrierten numerischen Typen, für die es keine implizite Konvertierung gibt:

Von Beschreibung
sbyte byte, ushort, uint, ulong oder nuint
byte sbyte
short sbyte, byte, ushort, uint, ulong oder nuint
ushort sbyte, byteoder short
int sbyte, byte, short, ushort, uint, ulong oder nuint
uint sbyte, byte, short, ushort oder int
long sbyte, byte, short, ushort, int, uint, ulong, nint oder nuint
ulong sbyte, byte, short, ushort, int, uint, long, nint oder nuint
float sbyte, byte, short, ushort, int, uint, long, ulong, decimal, nint oder nuint
double sbyte, byte, short, ushort, int, uint, long, ulong, float, decimal, nint oder nuint
decimal sbyte, byte, short, ushort, int, uint, long, ulong, float, double, nint oder nuint
nint sbyte, byte, short, ushort, int, uint, ulong oder nuint
nuint sbyte, byte, short, ushort, int, uint, long oder nint

Hinweis

Eine explizite numerische Konvertierung kann zu Datenverlust führen oder eine Ausnahme auslösen, typischerweise ein OverflowException.

Beachten Sie außerdem Folgendes:

  • Wenn Sie einen Wert von einem integralen Typ in einen anderen integralen Typ konvertieren, ist das Ergebnis vom Kontext der Überlaufprüfung abhängig. Die Konvertierung in einem geprüften Kontext ist erfolgreich, wenn der Quellwert sich innerhalb des Bereichs des Zieltyps befindet. Andernfalls wird eine OverflowException ausgelöst. In einem ungeprüften Kontext ist die Konvertierung immer erfolgreich, und sie verläuft wie folgt:

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

    • Wenn der Quelltyp kleiner als der Zieltyp ist, ist der Quellwert entweder signaturerweitert oder mit Null erweitert, sodass er die gleiche Größe wie der Zieltyp hat. Die Vorzeichenerweiterung wird verwendet, wenn der Quelltyp mit einem Vorzeichen versehen ist. Die Erweiterung mit Nullen (0) wird verwendet, wenn der Quelltyp mit keinem Vorzeichen versehen ist. 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 vom Zieltyp behandelt.

  • Wenn Sie einen decimal-Wert in einen integralen Typ konvertieren, wird dieser Wert Richtung 0 (null) auf den nächsten Integralwert gerundet. Wenn der erzeugte Integralwert sich außerhalb des Bereichs des Zieltyps befindet, wird eine OverflowException ausgelöst.

  • Wenn Sie einen double- oderfloat-Wert in einen integralen Typ konvertieren, wird dieser Wert Richtung 0 (null) auf den nächsten Integralwert gerundet. Wenn der resultierende Integralwert sich außerhalb des Bereichs des Zieltyps befindet, hängt das Ergebnis vom Kontext der Überlaufprüfung ab. In einem geprüften Kontext wird eine OverflowException ausgelöst, während das Ergebnis in einem ungeprüften Kontext ein nicht angegebener Wert des Zieltyps ist.

  • Wenn Sie double in float konvertieren, wird 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 zu passen, ist das Ergebnis 0 (null) oder unendlich.

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

    • Wenn der Quellwert zu klein ist, als dass er als decimal dargestellt werden könnte, ist das Ergebnis 0 (null).

    • Wenn der Quellwert NaN (nicht numerisch), unendlich oder zu groß ist, um als decimal dargestellt zu werden, wird eine OverflowException ausgelöst.

  • Wenn Sie decimal in float oder double konvertieren, wird der Quellwert in den nächsten float- oder double-Wert konvertiert.

C#-Sprachspezifikation

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

Siehe auch