共用方式為


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

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

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

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

小提示

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

隱含數值轉換

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

寄件者 發往
位元組 shortintlong、、floatdoubledecimal、 或nint
位元組 shortushortintuint、、longulongfloatdouble、或 decimalnintnuint
簡短 intlongfloatdoubledecimalnint
ushort intuintlongulongfloatdoubledecimal、、 或 nintnuint
int longfloatdoubledecimalnint
uint longulongfloatdoubledecimalnuint
floatdoubledecimal
ulong floatdoubledecimal
浮動 double
nint longfloatdoubledecimal
nuint ulongfloatdoubledecimal

備註

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

另請注意

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

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

  • 類型與 decimalfloat 類型之間double沒有隱含轉換。

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

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

如果常數值不在目標類型的範圍內,就會發生編譯器錯誤 CS0031

明確數值轉換

下表顯示了內建數值類型之間預設的顯式轉換,且這些類型沒有 隱式轉換

寄件者 發往
位元組 byteushortuintulongnuint
位元組 sbyte
簡短 sbytebyteushortuintulongnuint
ushort sbytebyteshort
int sbytebyteshort、、ushortuintulong、 或nuint
uint sbytebyteshortushortintnint
sbytebyteshortushortintuintulong、、 或 nintnuint
ulong sbytebyteshortushortintuintlong、、 或 nintnuint
浮動 sbytebyteshortushort、、intuintlongulong、或 decimalnintnuint
雙倍 sbytebyteshortushort、、、intuintlongulongfloat、或 decimalnintnuint
十進位 sbytebyteshortushort、、、intuintlongulongfloat、或 doublenintnuint
nint sbytebyteshort、、ushortintuintulong、 或nuint
nuint sbytebyteshort、、ushortintuintlong、 或nint

備註

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

另請注意:

  • 當您將整數類型的值轉換成另一個整數類型時,結果取決於 溢位檢查內容。 在核取的內容中,如果來源值在目的地類型範圍內,轉換就會成功。 否則會拋出 OverflowException。 在未核取的內容中,轉換一律會成功,然後繼續進行,如下所示:

    • 如果來源類型大於目的地類型,則會捨棄其「額外」最重要的位來截斷來源值。 然後,結果將被視為目的地類型的值。
    • 如果來源類型小於目的地類型,則來源值會是符號擴充或零延伸,使其大小與目的地類型相同。 如果來源類型已簽署,則會使用 Sign-extension;如果來源類型為不帶正負號,則會使用零延伸模組。 然後,結果將被視為目的地類型的值。
    • 如果來源類型的大小與目的地類型相同,則來源值會被視為目的地類型的值。
  • 當你將一個 decimal 值轉換成積分型態時,這個值會四捨五入到最接近的整數值。 如果產生的整數值超出目的型別的範圍, OverflowException 則會擲回 。

  • 當你將 a doublefloat 值轉換成積分型態時,這個值會四捨五入到最接近的整數值。 如果產生的整數值超出目的類型的範圍,則結果取決於 溢位檢查內容。 在已檢查的內容中, OverflowException 會擲回 ,而在未核取的內容中,結果是目的地類型的未指定值。

  • 當您轉換成 doublefloat時,值 double 會四捨五入為最 float 接近的值。 double如果值太小或太大而無法放入float類型中,則結果為零或無限大。

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

    • 如果來源值太小而無法表示為 decimal,則結果會變成零。
    • 如果來源值為 NaN(不是數位)、無限大或太大而無法表示為 decimalOverflowException 則會擲回 。
  • 當您轉換成 decimalfloatdouble時,來源值會分別四捨五入為最 float 接近或 double 值。

C# 語言規格

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

另請參閱