內建數值轉換 (C# 參考)

C# 提供一組 整數浮點數值型別。 任何兩個數值型別之間存在一個轉換,可以是隱含或明確。 您必須使用轉換運算式來執行明確轉換。

隱含數值轉換

下表顯示內建數值型別間預先定義的隱含數值轉換:

sbyte shortintlongfloatdoubledecimalnint
byte shortushortintuintlongulongfloatdoubledecimalnintnuint
short intlongfloatdoubledecimalnint
ushort intuintlongulongfloatdoubledecimalnintnuint
int longfloatdoubledecimalnint
uint longulongfloatdoubledecimalnuint
long floatdoubledecimal
ulong floatdoubledecimal
float double
nint longfloatdoubledecimal
nuint ulongfloatdoubledecimal

注意

intuintlongulongnintnuintfloat 以及從 longulongnintnuintdouble 的隱含轉換可能會導致精確度遺失,但永遠不會遺失大小順序。 其他隱含數值轉換永遠不會遺失任何資訊。

另請注意

  • 任何整數數值型別都會隱含轉換為任何浮點數值型別

  • bytesbyte 型別沒有隱含轉換。 沒有來自 doubledecimal 類型的隱含轉換。

  • decimal 類型和 floatdouble 類型之間沒有隱含轉換。

  • 型別 int 常數運算式的值 (例如整數常值所代表的值) 可以轉換成 sbytebyteshortushortuintulongnintnuint,前提是其在目的地型別的範圍內:

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

    如上述範例所示,如果常數的值不在目的地型別的範圍內,就會發生編譯器錯誤 CS0031

明確數值轉換

下表顯示內建數值型別間預先定義的明確轉換不含有隱含轉換

sbyte byteushortuintulongnuint
byte sbyte
short sbytebyteushortuintulongnuint
ushort sbytebyteshort
int sbytebyteshortushortuintulongnuint
uint sbytebyteshortushortintnint
long sbytebyteshortushortintuintulongnintnuint
ulong sbytebyteshortushortintuintlongnintnuint
float sbytebyteshortushortintuintlongulongdecimalnintnuint
double sbytebyteshortushortintuintlongulongfloatdecimalnintnuint
decimal sbytebyteshortushortintuintlongulongfloatdoublenintnuint
nint sbytebyteshortushortintuintulongnuint
nuint sbytebyteshortushortintuintlongnint

注意

明確的數值轉換可能會導致資料遺失或擲回例外狀況,通常是 OverflowException

另請注意:

  • 將整數型別的值轉換為另一個整數型別時,結果取決於溢位檢查內容。 在已檢查的內容中,如果來源值在目標類型的範圍內,轉換將會成功。 否則會擲回 OverflowException。 在未檢查的内容中,轉換一律會成功,並依下列方式進行:

    • 如果來源類型大於目的地類型,則透過捨棄其「額外」最有效位元來截斷來源值。 然後,結果將被視為目的地類型的值。

    • 如果來源類型小於目的地類型,則來源值是符號延伸的或零延伸的,因此其大小與目的地類型相同。 如果來源類型具有符號,則使用符號延伸;如果來源類型是無符號的,則使用零延伸。 然後,結果將被視為目的地類型的值。

    • 如果來源類型與目的地類型大小相同,則將來源值視為目的地類型的值。

  • 當您將 decimal 值轉換為整數型別時,這個值會捨入到最接近整數值的零。 如果產生的整數值超出目的地類型的範圍,就會擲回 OverflowException

  • 當您將 doublefloat 值轉換為整數型別時,這個值會往零的方向捨入到最接近的整數值。 如果產生的整數值超出目的地型別的範圍,結果隨溢位檢查內容而異。 在已檢查的內容中會擲回 OverflowException,而在未經檢查的內容中,結果是目的地類型的未指定值。

  • 當您將 double 轉換成 float 時,double 值會捨入到最接近 float 值。 如果 double 值太小或太大以致不符合 float 型別,結果會是零或無限大。

  • 當您將 floatdouble 轉換成 decimal 時,來源值會轉換成 decimal 表示,必要時捨入到最接近第 28 個小數位數後的數字。 視來源值的值而定,可能會發生下列一種結果:

    • 如果來源值太小無法以 decimal 表示,結果就會變成零。

    • 如果來源值是 NaN (不是數字)、無限大或太大,無法以 decimal 表示,就會擲回 OverflowException

  • 當您將 decimal 轉換成 floatdouble 時,來源值會各別捨入到最接近 floatdouble 值。

C# 語言規格

如需詳細資訊,請參閱 C# 語言規格的下列幾節:

另請參閱