内置数值转换 (C# 参考)

C# 提供一组 整数浮点 数值类型。 任何两种数值类型(隐式或显式)之间存在转换。 必须使用 强制转换表达式 来执行显式转换。

隐式数值转换

下表显示了内置数值类型之间的预定义隐式转换:

来自
sbyte short、、intfloatlongdouble、、decimalnint
byte short、、ushortuintint、、ulonglongfloat、、doubledecimalnintnuint
int、、longdoublefloat、或decimalnint
ushort int、、uintlongulongfloatdoubledecimal、或 nintnuint
int long、、floatdouble、或decimalnint
uint long、、ulongdoublefloat、或decimalnuint
floatdoubledecimal
ulong floatdoubledecimal
漂浮 double
nint longfloatdoubledecimal
nuint ulongfloatdoubledecimal

注释

隐式转换从int、、uintlongulongnintnuintlongfloatulongnint,或nuintdouble可能导致精度损失,但永远不会丢失数量级。 其他隐式数值转换不会丢失任何信息。

另请注意,

  • 任何 整型数值类型 都隐式转换为任何 浮点数值类型

  • 没有对和sbyte类型的隐式转换byte。 没有来自 doubledecimal 类型的隐式转换。

  • 类型与float类型double之间decimal没有隐式转换。

  • 类型的int常量表达式的值(例如,由整数文本表示的值)可以隐式转换为sbytebyte、、shortushortuintulong、、nintnuint目标类型范围内的值:

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

    如前面的示例所示,如果常量值不在目标类型范围内,则会发生编译器错误 CS0031

显式数值转换

下表显示了没有 隐式转换的内置数值类型之间的预定义显式转换:

来自
sbyte byteushortuintulongnuint
byte sbyte
sbytebyteushortuintulongnuint
ushort sbytebyteshort
int sbyte、、byteushortshortuint、、ulongnuint
uint sbytebyteshortushortintnint
sbyte、、byteushortshortintuintulong、或 nintnuint
ulong sbyte、、byteushortshortintuintlong、或 nintnuint
漂浮 sbyte、、byteushortshort、、uintintlong、、ulongdecimalnintnuint
sbytebyte、、ushortshortintuintlongulong、、floatdecimalnintnuint
十进制 sbytebyte、、ushortshortintuintlongulong、、floatdoublenintnuint
nint sbyte、、byteushortshortintuint、、 ulongnuint
nuint sbyte、、byteushortshortintuint、、 longnint

注释

显式数值转换可能会导致数据丢失或引发异常,通常是一个 OverflowException

另请注意:

  • 将整型类型的值转换为另一个整型类型时,结果取决于 溢出检查上下文。 在选中的上下文中,如果源值在目标类型范围内,转换会成功。 否则会引发 OverflowException。 在不受限制的上下文中,转换总是成功的,具体过程如下:

    • 如果源类型大于目标类型,则通过放弃其“额外”最重要的位来截断源值。 结果会被视为目标类型的值。

    • 如果源类型小于目标类型,则源值为符号扩展或零扩展,使其大小与目标类型相同。 如果源类型已签名,则使用签名扩展;如果源类型未签名,则使用零扩展。 结果会被视为目标类型的值。

    • 如果源类型的大小与目标类型相同,则源值被视为目标类型的值。

  • 将值转换为 decimal 整型时,此值将舍入为零到最接近的整数值。 如果生成的整型值超出目标类型的范围,则会引发一个 OverflowException

  • 将某个 doublefloat 值转换为整型时,此值将舍入为零到最接近的整型值。 如果生成的整型值超出目标类型的范围,则结果取决于 溢出检查上下文。 在已检查的上下文中,将引发一个 OverflowException ,而在未选中的上下文中,结果是目标类型的未指定值。

  • 转换为doublefloat时,该值double将舍入为最接近float的值。 double如果值太小或太大而无法容纳到float类型中,则结果为零或无穷大。

  • 转换 floatdouble 转换为 decimal时,源值将转换为 decimal 表示形式,并在第 28 位小数后舍入为最接近的数字(如有必要)。 根据源值的值,可能会出现以下结果之一:

    • 如果源值太小,无法表示为 a decimal,则结果为零。

    • 如果源值为 NaN(不是数字)、无穷大或太大,无法表示为 a decimal,则会引发一个 OverflowException

  • 转换为或double转换decimalfloat时,源值将分别舍入到最接近float的值或double值。

C# 语言规范

有关更多信息,请参阅 C# 语言规范的以下部分:

另请参阅