C# 提供了一組整型和浮點數值類型。任何兩種數值類型之間都可以進行隱式或顯式轉換。顯式轉換必須使用強制轉換表達式來執行。
隱式數值轉換
下表顯示內置數值類型之間的預定義隱式轉換:
| From | 到 |
|---|---|
| sbyte | short、int、long、float、double、decimal 或 nint |
| byte | short、ushort、int、uint、long、ulong、float、double、decimal、nint 或 nuint |
| short | int、long、float、double、decimal 或 nint |
| ushort | int、uint、long、ulong、float、double、decimal、nint 或 nuint |
| int | long、float、double、decimal 或 nint |
| uint | long、ulong、float、double、decimal 或 nuint |
| long | float、double 或 decimal |
| ulong | float、double 或 decimal |
| float | double |
| nint | long、float、double 或 decimal |
| nuint | ulong、float、double 或 decimal |
備註:從 int、uint、long、ulong、nint 或 nuint 到 float 的隱式轉換以及從 long、ulong、nint 或 nuint 到 double 的隱式轉換可能會丟失精準率,但絕不會丟失一個數量級。其他隱式數值轉換不會丟失任何信息。
另請注意:
- 任何整型數值類型都可以隱式轉換為任何浮點數值類型。
- 不存在針對 byte 和 sbyte 類型的隱式轉換。不存在從 double 和 decimal 類型的隱式轉換。
- decimal 類型和 float 或 double 類型之間不存在隱式轉換。
-
類型 int 的常量表達式的值(例如,由整數文本所表示的值)如果在目標類型的範圍內,則可隱式轉換為 sbyte、byte、short、ushort、uint、ulong、nint 或 nuint:
byte a = 150; byte b = 300; // 警告 CS0031:常量值 “300” 無法轉換為 “byte”顯式數值轉換
下表顯示不存在隱式轉換的內置數值類型之間的預定義顯式轉換:
源 目標 sbyte byte、ushort、uint、ulong 或 nuint byte sbyte short sbyte、byte、ushort、uint、ulong 或 nuint ushort sbyte、byte 或 short int sbyte、byte、short、ushort、uint、ulong 或 nuint uint sbyte、byte、short、ushort、int 或 nint long sbyte、byte、short、ushort、int、uint、ulong、nint 或 nuint ulong sbyte、byte、short、ushort、int、uint、long、nint 或 nuint float sbyte、byte、short、ushort、int、uint、long、ulong、decimal、nint 或 nuint double sbyte、byte、short、ushort、int、uint、long、ulong、float、decimal、nint 或 nuint decimal sbyte、byte、short、ushort、int、uint、long、ulong、float、double、nint 或 nuint nint sbyte、byte、short、ushort、int、uint、ulong 或 nuint nuint sbyte、byte、short、ushort、int、uint、long 或 nint
備註:顯式數值轉換可能會導致數據丟失或引發異常,通常為 OverflowException。
另請注意:
-
將整數類型的值轉換為另一個整數類型時,結果取決於溢出檢查上下文。在已檢查的上下文中,如果源值在目標類型的範圍內,則轉換成功。否則會引發 OverflowException。在未檢查的上下文中,轉換始終成功,並按如下方式進行:
- 如果源類型大於目標類型,則通過放棄其“額外”最高有效位來截斷源值。結果會被視為目標類型的值。
- 如果源類型小於目標類型,則源值是符號擴展或零擴展,以使其與目標類型的大小相同。如果源類型帶符號,則是符號擴展;如果源類型是無符號的,則是零擴展。結果會被視為目標類型的值。
- 如果源類型與目標類型的大小相同,則源值將被視為目標類型的值。
- 將 decimal 值轉換為整型類型時,此值會向零舍入到最接近的整數值。如果生成的整數值處於目標類型的範圍之外,則會引發 OverflowException。
- 將 double 或 float 值轉換為整型類型時,此值會向零舍入到最接近的整數值。如果生成的整數值處於目標類型範圍之外,則結果會取決於溢出上下文。在已檢查的上下文中,引發 OverflowException;而在未檢查的上下文中,結果是目標類型的未指定值。
- 將 double 轉換為 float 時,double 值舍入為最接近的 float 值。如果 double 值太小或太大,無法匹配 float 類型,結果將為零或無窮大。
-
將 float 或 double 轉換為 decimal 時,源值轉換為 decimal 表示形式,並並五入到第 28 位小數後最接近的數(如有必要)。根據源值的值,可能出現以下結果之一:
- 如果源值太小,無法表示為 decimal,結果則為零。
- 如果源值為 NaN(非數值)、無窮大或太大而無法表示為 decimal,則引發 OverflowException。
- 將 decimal 轉換為 float 或 double 時,源值分別舍入為最接近的 float 或 double 值。