C# 提供一组 整数 和 浮点 数值类型。 任何两个数值类型之间存在隐式或显式转换。 使用 强制转换表达式 执行显式转换。
C# 语言参考记录了最近发布的 C# 语言版本。 它还包含即将发布的语言版本公共预览版中功能的初始文档。
本文档标识了在语言的最后三个版本或当前公共预览版中首次引入的任何功能。
小窍门
若要查找 C# 中首次引入功能时,请参阅 有关 C# 语言版本历史记录的文章。
隐式数值转换
下表显示了内置数值类型之间的预定义隐式转换:
| 来自 | 到 |
|---|---|
| sbyte |
short、、int、longfloat、double、、decimal或nint |
| byte |
short、、ushort、intuint、、longulong、float、、double、decimal或 nintnuint |
| 短 |
int、 long、 float、 double、 decimal或 nint |
| ushort |
int、、uint、longulong、float、double、decimal、或 nintnuint |
| int |
long、float、double、decimal 或 nint |
| uint |
long、 ulong、 float、 double、 decimal或 nuint |
| 长 |
float、double 或 decimal |
| ulong |
float、double 或 decimal |
| 漂浮 | double |
| nint |
long、float、double 或 decimal |
| nuint |
ulong、float、double 或 decimal |
注释
隐式转换从int、、uint、longnintulong或nuint向float和从ulonglong、或、或 nintnuintdouble可能导致精度损失,但绝不会丢失数量级。 其他隐式数值转换不会丢失任何信息。
另请注意,
没有对和
byte类型的隐式转换sbyte。 没有来自double和decimal类型的隐式转换。类型与
decimal类型float之间double没有隐式转换。类型的
int常量表达式的值(例如,由整数文本表示的值)可以隐式转换为sbyte目标类型范围内的值、byte、short、ushortulonguint、或nintnuint是否在目标类型范围内:byte a = 13; byte b = 300; // CS0031: Constant value '300' cannot be converted to a 'byte'
如果常量值不在目标类型范围内,则会发生编译器错误 CS0031 。
显式数值转换
下表显示了没有 隐式转换的内置数值类型之间的预定义显式转换:
| 来自 | 到 |
|---|---|
| sbyte |
byte、ushort、uint、ulong 或 nuint |
| byte | sbyte |
| 短 |
sbyte、 byte、 ushort、 uint、 ulong或 nuint |
| ushort |
sbyte、byte 或 short |
| int |
sbyte、、byte、shortushort、uint、、ulong或nuint |
| uint |
sbyte、 byte、 short、 ushort、 int或 nint |
| 长 |
sbyte、、byte、shortushort、int、uint、ulong、或 nintnuint |
| ulong |
sbyte、、byte、shortushort、int、uint、long、或 nintnuint |
| 漂浮 |
sbyte、、byte、shortushort、、intuint、long、、ulong、decimal或 nintnuint |
| 双 |
sbyte、byte、、shortushort、int、uint、long、ulong、、float、decimal或 nintnuint |
| 十进制 |
sbyte、byte、、shortushort、int、uint、long、ulong、、float、double或 nintnuint |
| nint |
sbyte、、byte、shortushort、int、uint、、 ulong或nuint |
| nuint |
sbyte、、byte、shortushort、int、uint、、 long或nint |
注释
显式数值转换可能会导致数据丢失或引发异常,通常是一个 OverflowException。
另请注意:
将整型类型的值转换为另一个整型类型时,结果取决于 溢出检查上下文。 在选中的上下文中,如果源值在目标类型范围内,转换会成功。 否则会引发 OverflowException。 在不受限制的上下文中,转换总是成功的,具体过程如下:
- 如果源类型大于目标类型,则通过放弃其“额外”最重要的位来截断源值。 结果会被视为目标类型的值。
- 如果源类型小于目标类型,则源值为符号扩展或零扩展,使其大小与目标类型相同。 如果源类型已签名,则使用签名扩展;如果源类型未签名,则使用零扩展。 结果会被视为目标类型的值。
- 如果源类型的大小与目标类型相同,则源值被视为目标类型的值。
将值转换为
decimal整型类型时,此值将舍入为零到最接近的整型值。 如果生成的整型值超出目标类型的范围,则会引发一个 OverflowException 。将某个
double或float值转换为整型类型时,此值将舍入为零到最接近的整型值。 如果生成的整型值超出目标类型的范围,则结果取决于 溢出检查上下文。 在已检查的上下文中,将引发一个 OverflowException ,而在未选中的上下文中,结果是目标类型的未指定值。转换为
doublefloat时,该值double将舍入为最接近float的值。double如果值太小或太大而无法容纳到float类型中,则结果为零或无穷大。转换
float或double转换为decimal时,源值将转换为decimal表示形式,并在第 28 位小数后舍入为最接近的数字(如有必要)。 根据源值的值,可能会出现以下结果之一:- 如果源值太小,无法表示为 a
decimal,则结果为零。 - 如果源值为 NaN(不是数字)、无穷大或太大,无法表示为 a
decimal,则会引发一个 OverflowException 。
- 如果源值太小,无法表示为 a
转换为或
decimal转换floatdouble时,源值将分别舍入到最接近float的值或double值。
C# 语言规范
有关更多信息,请参阅 C# 语言规范的以下部分: