本文内容
- 隐式数值转换
- 显式数值转换
C# 提供了一组整型和浮点数值类型。 任何两种数值类型之间都可以进行隐式或显式转换。 必须使用强制转换表达式来执行显式转换。
1、隐式数值转换
下表显示内置数值类型之间的预定义隐式转换:
| From | 到 |
|---|---|
| sbyte | short、int、long、float、double、decimal 或 nint。 |
| byte | short、ushort、int、uint、long、ulong、float、double、decimal、nint 或 nuint |
| short | int、long、float、double、decimal 或 nint |
| ushort | int、uint、long、ulong、float、double、decimal、nint 或 nuint |
| 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、ulong、nint 或 nuint 到 float 的隐式转换以及从 long、ulong、nint 或 nuint 到 double 的隐式转换可能会丢失精准率,但绝不会丢失一个数量级。 其他隐式数值转换不会丢失任何信息。
注意:
-
任何整型数值类型都可以隐式转换为任何浮点数值类型。
-
不存在针对
byte和sbyte类型的隐式转换。 不存在从double和decimal类型的隐式转换。 -
decimal类型和float或double类型之间不存在隐式转换。 -
类型
int的常量表达式的值(例如,由整数文本所表示的值)如果在目标类型的范围内,则可隐式转换为sbyte、byte、short、ushort、uint、ulong、nint或nuint:byte a = 13; byte b = 300; // CS0031: Constant value '300' cannot be converted to a 'byte'如前面的示例所示,如果该常量值不在目标类型的范围内,则发生编译器错误 CS0031。
2、显式数值转换
下表显示不存在隐式转换的内置数值类型之间的预定义显式转换:
| From | 到 |
|---|---|
| sbyte | byte、ushort、uint、ulong 或 nuint |
| byte | sbyte |
| short | sbyte、byte、ushort、uint、ulong 或 nuint |
| ushort | sbyte、byte 或 short |
| int | sbyte、byte、short、ushort、uint、ulong 或 nuint。 |
| uint | sbyte、byte、short、ushort、int 或 nint |
| long | sbyte、byte、short、ushort、int、uint、ulong、nint 或 nuint |
| ulong | sbyte、byte、short、ushort、int、uint、long、nint 或 nuint |
| float | sbyte、byte、short、ushort、int、uint、long、ulong、decimal、nint 或 nuint |
| double | sbyte、byte、short、ushort、int、uint、long、ulong、float、decimal、nint 或 nuint |
| decimal | sbyte、byte、short、ushort、int、uint、long、ulong、float、double、nint 或 nuint |
| nint | sbyte、byte、short、ushort、int、uint、ulong 或 nuint |
| nuint | sbyte、byte、short、ushort、int、uint、long 或 nint |
显式数值转换可能会导致数据丢失或引发异常,通常为 OverflowException。
注意:
-
将整数类型的值转换为另一个整数类型时,结果取决于溢出检查上下文。 在已检查的上下文中,如果源值在目标类型的范围内,则转换成功。 否则会引发 OverflowException。 在未检查的上下文中,转换始终成功,并按如下方式进行:
-
如果源类型大于目标类型,则通过放弃其“额外”最高有效位来截断源值。 结果会被视为目标类型的值。
-
如果源类型小于目标类型,则源值是符号扩展或零扩展,以使其与目标类型的大小相同。 如果源类型带符号,则是符号扩展;如果源类型是无符号的,则是零扩展。 结果会被视为目标类型的值。
-
如果源类型与目标类型的大小相同,则源值将被视为目标类型的值。
-
-
将
decimal值转换为整型类型时,此值会向零舍入到最接近的整数值。 如果生成的整数值处于目标类型的范围之外,则会引发 OverflowException。 -
将
double或float值转换为整型类型时,此值会向零舍入到最接近的整数值。 如果生成的整数值处于目标类型范围之外,则结果会取决于溢出上下文。 在已检查的上下文中,引发 OverflowException;而在未检查的上下文中,结果是目标类型的未指定值。 -
将
double转换为float时,double值舍入为最接近的float值。 如果double值太小或太大,无法匹配float类型,结果将为零或无穷大。 -
将
float或double转换为decimal时,源值转换为decimal表示形式,并并五入到第 28 位小数后最接近的数(如有必要)。 根据源值的值,可能出现以下结果之一:-
如果源值太小,无法表示为
decimal,结果则为零。 -
如果源值为 NaN(非数值)、无穷大或太大而无法表示为
decimal,则引发 OverflowException。
-
-
将
decimal转换为float或double时,源值分别舍入为最接近的float或double值。