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 , double oder decimal |
ulong | float , double oder decimal |
float | double |
nint | long , float , double oder decimal |
nuint | ulong , float , double oder 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
undsbyte
. Es gibt keine impliziten Konvertierungen aus den Typendouble
unddecimal
.Es gibt keine impliziten Konvertierungen zwischen dem Typ
decimal
und dem Typfloat
oderdouble
.Ein Wert eines konstanten Ausdrucks vom Typ
int
(z. B. ein Wert, der durch ein ganzzahliges Literal dargestellt wird), kann implizit insbyte
,byte
,short
,ushort
,uint
,ulong
,nint
odernuint
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 , byte oder short |
int | sbyte , byte , short , ushort , uint , ulong oder nuint |
uint | sbyte , byte , short , ushort , int oder nint |
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
infloat
konvertieren, wird derdouble
-Wert auf den nächstenfloat
-Wert gerundet. Wenn derdouble
-Wert zu klein oder zu groß ist, um in denfloat
-Typ zu passen, ist das Ergebnis 0 (null) oder unendlich.Wenn Sie
float
oderdouble
indecimal
konvertieren, wird der Quellwert in einedecimal
-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
infloat
oderdouble
konvertieren, wird der Quellwert in den nächstenfloat
- oderdouble
-Wert konvertiert.
C#-Sprachspezifikation
Weitere Informationen finden Sie in den folgenden Abschnitten der C#-Sprachspezifikation: