C# 提供一組 整數 和 浮點 數值類型。 任何兩個數字類型之間存在隱含或顯式轉換。 使用 鑄法表達 式來執行明確的轉換。
C# 語言參考資料記錄了 C# 語言最新版本。 同時也包含即將推出語言版本公開預覽功能的初步文件。
文件中標示了語言最近三個版本或目前公開預覽版中首次引入的任何功能。
小提示
欲查詢某功能何時首次在 C# 中引入,請參閱 C# 語言版本歷史的條目。
隱含數值轉換
下表顯示內建數值類型之間的預先定義隱含轉換:
| 寄件者 | 發往 |
|---|---|
| 位元組 |
short、int、long、、float、doubledecimal、 或nint |
| 位元組 |
short、ushort、int、uint、、long、ulongfloatdouble、或 decimalnintnuint |
| 簡短 |
int、 long、 float、 double、 decimal或 nint |
| ushort |
int、uint、long、ulong、floatdoubledecimal、、 或 nintnuint |
| int |
long、float、double、decimal 或 nint |
| uint |
long、 ulong、 float、 double、 decimal或 nuint |
| 長 |
float、 double或 decimal |
| ulong |
float、 double或 decimal |
| 浮動 | double |
| nint |
long、float、double或 decimal |
| nuint |
ulong、float、double或 decimal |
備註
從 int、 uint、 long、 ulongnint、 或 nuint 從 、 或 到 ulongdoublefloatlongnintnuint 的隱式轉換可能導致精度損失,但絕不會損失數量級。 其他隱含數值轉換永遠不會遺失任何資訊。
另請注意
和型別沒有隱含轉換
bytesbyte。 和double型別沒有隱含轉換decimal。類型與
decimal或float類型之間double沒有隱含轉換。常數表達
int式的值(例如以整數字面值表示)可以隱式轉換為sbyte,byte,ulongnuintshortushortuintnint或如果它在目標型別範圍內: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、uintulong、 或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、uintlongulong、或 decimalnintnuint |
| 雙倍 |
sbyte、byte、short、ushort、、、intuintlongulongfloat、或 decimalnintnuint |
| 十進位 |
sbyte、byte、short、ushort、、、intuintlongulongfloat、或 doublenintnuint |
| nint |
sbyte、byte、short、、ushort、int、uintulong、 或nuint |
| nuint |
sbyte、byte、short、、ushort、int、uintlong、 或nint |
備註
明確的數值轉換可能會導致資料遺失或擲回例外狀況,通常是 OverflowException。
另請注意:
當您將整數類型的值轉換成另一個整數類型時,結果取決於 溢位檢查內容。 在核取的內容中,如果來源值在目的地類型範圍內,轉換就會成功。 否則會拋出 OverflowException。 在未核取的內容中,轉換一律會成功,然後繼續進行,如下所示:
- 如果來源類型大於目的地類型,則會捨棄其「額外」最重要的位來截斷來源值。 然後,結果將被視為目的地類型的值。
- 如果來源類型小於目的地類型,則來源值會是符號擴充或零延伸,使其大小與目的地類型相同。 如果來源類型已簽署,則會使用 Sign-extension;如果來源類型為不帶正負號,則會使用零延伸模組。 然後,結果將被視為目的地類型的值。
- 如果來源類型的大小與目的地類型相同,則來源值會被視為目的地類型的值。
當你將一個
decimal值轉換成積分型態時,這個值會四捨五入到最接近的整數值。 如果產生的整數值超出目的型別的範圍, OverflowException 則會擲回 。當你將 a
double或float值轉換成積分型態時,這個值會四捨五入到最接近的整數值。 如果產生的整數值超出目的類型的範圍,則結果取決於 溢位檢查內容。 在已檢查的內容中, OverflowException 會擲回 ,而在未核取的內容中,結果是目的地類型的未指定值。當您轉換成
doublefloat時,值double會四捨五入為最float接近的值。double如果值太小或太大而無法放入float類型中,則結果為零或無限大。當您將 或
floatdouble轉換成decimal時,來源值會轉換成decimal表示,並視需要捨入到第 28 個小數點之後最接近的數位。 視來源值的值而定,可能會發生下列其中一個結果:- 如果來源值太小而無法表示為
decimal,則結果會變成零。 - 如果來源值為 NaN(不是數位)、無限大或太大而無法表示為
decimal, OverflowException 則會擲回 。
- 如果來源值太小而無法表示為
當您轉換成
decimalfloat或double時,來源值會分別四捨五入為最float接近或double值。
C# 語言規格
如需詳細資訊,請參閱 C# 語言規格的下列幾節: