C# 提供一組 整數 和 浮點 數值類型。 任何兩個數值類型之間都有轉換,可以是隱含或明確。 您必須使用 轉換表示式 來執行明確的轉換。
隱含數值轉換
下表顯示內建數值類型之間的預先定義隱含轉換:
| 寄件者 | 發往 |
|---|---|
| 位元組 |
short、int、long、、float、decimaldouble、 或nint |
| 位元組 |
short、ushort、int、uint、、long、ulongdoublefloat、或 nintdecimalnuint |
| 簡短 |
int、long、float、double、 或 decimalnint |
| ushort |
int、uint、long、、ulong、doublefloat、 或 decimal、 nint或nuint |
| int |
long、 float、 double、 或 decimal、 nint |
| uint |
long、ulong、float、double、 或 decimalnuint |
| 長 |
float、 double或 decimal |
| ulong |
float、 double或 decimal |
| 浮動 | double |
| nint |
long、float、double或 decimal |
| nuint |
ulong、float、double或 decimal |
備註
從 int、uint、、、nintulonglong、 或 nuint 到 float 和 nuintnintlongulongdouble 的隱含轉換,可能會導致精確度遺失,但絕對不會遺失大小順序。 其他隱含數值轉換永遠不會遺失任何資訊。
另請注意
和型別沒有隱含轉換
bytesbyte。 和decimal型別沒有隱含轉換double。類型與
float或double類型之間decimal沒有隱含轉換。型
int別常數表達式的值(例如,以整數常值表示的值)可以隱含地轉換成sbyte、byte、、uintushortshortulong、nint或nuint,如果它位於目的型別的範圍內:byte a = 13; byte b = 300; // CS0031: Constant value '300' cannot be converted to a 'byte'如上述範例所示,如果常數值不在目的地類型的範圍內,就會發生編譯程式錯誤 CS0031 。
明確數值轉換
下表顯示內建數值類型之間沒有 隱含轉換的預先定義明確轉換:
| 寄件者 | 發往 |
|---|---|
| 位元組 |
byte、ushort、uint、ulong 或 nuint |
| 位元組 | sbyte |
| 簡短 |
sbyte、 byte、 ushort、 uint、 ulong或 nuint |
| ushort |
sbyte、 byte或 short |
| int |
sbyte、byte、short、、ushort、ulonguint、 或nuint |
| uint |
sbyte、 byte、 short、 ushort、 int或 nint |
| 長 |
sbyte、byte、short、ushort、intuintulong、、 或 nintnuint |
| ulong |
sbyte、byte、short、ushort、intuintlong、、 或 nintnuint |
| 浮動 |
sbyte、byte、short、ushort、、int、uintulonglong、或 nintdecimalnuint |
| 雙倍 |
sbyte、byte、short、ushort、、、floatuintlongintulong、或 nintdecimalnuint |
| 十進位 |
sbyte、byte、short、ushort、、、floatuintlongintulong、或 nintdoublenuint |
| nint |
sbyte、byte、short、、ushort、int、ulonguint、 或nuint |
| nuint |
sbyte、byte、short、、ushort、int、longuint、 或nint |
備註
明確的數值轉換可能會導致資料遺失或擲回例外狀況,通常是 OverflowException。
另請注意:
當您將整數類型的值轉換成另一個整數類型時,結果取決於 溢位檢查內容。 在核取的內容中,如果來源值在目的地類型範圍內,轉換就會成功。 否則會拋出 OverflowException。 在未核取的內容中,轉換一律會成功,然後繼續進行,如下所示:
如果來源類型大於目的地類型,則會捨棄其「額外」最重要的位來截斷來源值。 然後,結果將被視為目的地類型的值。
如果來源類型小於目的地類型,則來源值會是符號擴充或零延伸,使其大小與目的地類型相同。 如果來源類型已簽署,則會使用 Sign-extension;如果來源類型為不帶正負號,則會使用零延伸模組。 然後,結果將被視為目的地類型的值。
如果來源類型的大小與目的地類型相同,則來源值會被視為目的地類型的值。
當您將
decimal值轉換成整數類型時,這個值會四捨五入為零到最接近的整數值。 如果產生的整數值超出目的型別的範圍, OverflowException 則會擲回 。當您將 或
float值轉換成double整數類型時,這個值會四捨五入為零到最接近的整數值。 如果產生的整數值超出目的類型的範圍,則結果取決於 溢位檢查內容。 在已檢查的內容中, OverflowException 會擲回 ,而在未核取的內容中,結果是目的地類型的未指定值。當您轉換成
doublefloat時,值double會四捨五入為最float接近的值。double如果值太小或太大而無法放入float類型中,則結果為零或無限大。當您將 或
doubledecimal轉換成float時,來源值會轉換成decimal表示,並視需要捨入到第 28 個小數點之後最接近的數位。 視來源值的值而定,可能會發生下列其中一個結果:如果來源值太小而無法表示為
decimal,則結果會變成零。如果來源值為 NaN(不是數位)、無限大或太大而無法表示為
decimal, OverflowException 則會擲回 。
當您轉換成
decimalfloat或double時,來源值會分別四捨五入為最float接近或double值。
C# 語言規格
如需詳細資訊,請參閱 C# 語言規格的下列幾節: