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

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

C# 语言参考记录了最近发布的 C# 语言版本。 它还包含即将发布的语言版本公共预览版中功能的初始文档。

本文档标识了在语言的最后三个版本或当前公共预览版中首次引入的任何功能。

小窍门

若要查找 C# 中首次引入功能时,请参阅 有关 C# 语言版本历史记录的文章。

隐式数值转换

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

来自
sbyte short、、intlongfloatdouble、、decimalnint
byte short、、ushortintuint、、longulongfloat、、doubledecimalnintnuint
intlongfloatdoubledecimalnint
ushort int、、uintlongulongfloatdoubledecimal、或 nintnuint
int longfloatdoubledecimalnint
uint longulongfloatdoubledecimalnuint
floatdoubledecimal
ulong floatdoubledecimal
漂浮 double
nint longfloatdoubledecimal
nuint ulongfloatdoubledecimal

注释

隐式转换从int、、uintlongnintulongnuintfloat和从ulonglong、或、或 nintnuintdouble可能导致精度损失,但绝不会丢失数量级。 其他隐式数值转换不会丢失任何信息。

另请注意,

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

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

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

  • 类型的int常量表达式的值(例如,由整数文本表示的值)可以隐式转换为sbyte目标类型范围内的值、byteshortushortulonguint、或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、、byteshortushortuint、、ulongnuint
uint sbytebyteshortushortintnint
sbyte、、byteshortushortintuintulong、或 nintnuint
ulong sbyte、、byteshortushortintuintlong、或 nintnuint
漂浮 sbyte、、byteshortushort、、intuintlong、、ulongdecimalnintnuint
sbytebyte、、shortushortintuintlongulong、、floatdecimalnintnuint
十进制 sbytebyte、、shortushortintuintlongulong、、floatdoublenintnuint
nint sbyte、、byteshortushortintuint、、 ulongnuint
nuint sbyte、、byteshortushortintuint、、 longnint

注释

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

另请注意:

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

    • 如果源类型大于目标类型,则通过放弃其“额外”最重要的位来截断源值。 结果会被视为目标类型的值。
    • 如果源类型小于目标类型,则源值为符号扩展或零扩展,使其大小与目标类型相同。 如果源类型已签名,则使用签名扩展;如果源类型未签名,则使用零扩展。 结果会被视为目标类型的值。
    • 如果源类型的大小与目标类型相同,则源值被视为目标类型的值。
  • 将值转换为 decimal 整型类型时,此值将舍入为零到最接近的整型值。 如果生成的整型值超出目标类型的范围,则会引发一个 OverflowException

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

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

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

    • 如果源值太小,无法表示为 a decimal,则结果为零。
    • 如果源值为 NaN(不是数字)、无穷大或太大,无法表示为 a decimal,则会引发一个 OverflowException
  • 转换为或decimal转换floatdouble时,源值将分别舍入到最接近float的值或double值。

C# 语言规范

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

另请参阅