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

C# 提供一組 整數 和 浮點 數值類型。 任何兩個數字類型之間存在隱含或顯式轉換。 使用 鑄法表達 式來執行明確的轉換。

C# 語言參考資料記錄了 C# 語言最新版本。 同時也包含即將推出語言版本公開預覽功能的初步文件。

文件中標示了語言最近三個版本或目前公開預覽版中首次引入的任何功能。

小提示

欲查詢某功能何時首次在 C# 中引入,請參閱 C# 語言版本歷史的條目。

隱含數值轉換

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

寄件者 發往
sbyte short、int、long、、float、doubledecimal、 或nint
byte short、ushort、int、uint、、long、ulongfloatdouble、或 decimalnintnuint
short 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
long float、 double或 decimal
ulong float、 double或 decimal
float double
nint long、float、double或 decimal
nuint ulong、float、double或 decimal

備註

從 int、 uint、 long、 ulongnint、 或 nuint 從 、 或 到 floatlongulongnintnuintdouble 的隱式轉換可能導致精度損失,但絕不會損失數量級。 其他隱含數值轉換永遠不會遺失任何資訊。

另請注意

  • 任何 整數數值類型 都會隱含轉換成任何 浮點數值類型。

  • 和型別沒有隱含轉換bytesbyte。 和 double 型別沒有隱含轉換decimal。

  • 類型與 decimal 或 float 類型之間double沒有隱含轉換。

  • 常數表達int式的值(例如以整數字面值表示)可以隱式轉換為 sbyte, byte, shortushortuintulongnintnuint或如果它在目標型別範圍內:

    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 值。

    備註

    從 .NET 11 開始,與 floatdouble 之間的轉換decimal會正確四捨五入。 過去,這些轉換可能會四捨五入中間值或捨棄有效數字。 欲了解更多資訊,請參見「 十進位與大整數浮點轉換正確四捨五入」。

C# 語言規格

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

另請參閱