更新:2007 年 11 月
当一种类型的值转换为大小相等或更大的另一类型时,则发生扩大转换。当一种类型的值转换为较小的另一种类型时,则发生收缩转换。本主题中的表格解释了这两类转换表现的行为。
扩大转换
下表描述了可以执行的且不会丢失信息的扩大转换。
| 类型 | 可在不丢失数据的情况下转换为 | 
|---|---|
| Byte | UInt16、Int16、UInt32、Int32、UInt64、Int64、Single、Double、Decimal | 
| SByte | Int16、Int32、Int64、Single、Double、Decimal | 
| Int16 | Int32、Int64、Single、Double、Decimal | 
| UInt16 | UInt32、Int32、UInt64、Int64、Single、Double、Decimal | 
| Char | UInt16、UInt32、Int32、UInt64、Int64、Single、Double、Decimal | 
| Int32 | Int64、Double、Decimal | 
| UInt32 | Int64、Double、Decimal | 
| Int64 | Decimal | 
| UInt64 | Decimal | 
| Single | Double | 
一些目标为 Single 或 Double 的扩大转换可能会导致丢失精度。下面的表格描述了有时会导致信息丢失的扩大转换。
| 类型 | 可转换为 | 
|---|---|
| Int32 | Single | 
| UInt32 | Single | 
| Int64 | Single、Double | 
| UInt64 | Single、Double | 
| Decimal | Single、Double | 
收缩转换
目标为 Single 或 Double 的收缩转换可能会导致丢失信息。如果目标类型无法正确表达源类型的大小,则结果类型将设置为常数 PositiveInfinity 或 NegativeInfinity。PositiveInfinity 的值是正数除以 0 的结果,并且该值在 Single 或 Double 的值超过 MaxValue 字段的值时返回。NegativeInfinity 的值是负数除以 0 的结果,并且该值在 Single 或 Double 值小于 MinValue 字段的值时返回。从 Double 到 Single 的转换可能会导致 PositiveInfinity 或 NegativeInfinity。
收缩转换还可能导致其他数据类型的信息丢失。但是,如果转换的某类型值不在目标类型的 MaxValue 和 MinValue 字段指定的范围内,并且运行库检查该转换以确保目标类型的值不超出它的 MaxValue 或 MinValue,则会引发 OverflowException。使用 System.Convert 类执行的转换总是以这种方式检查。有关不使用 System.Convert 来执行所检查转换的信息,请参见有关显式转换的一节。
下表列出了使用 System.Convert 引发 OverflowException 的转换,或所转换类型的值不在结果类型的定义范围之内的任何已检查的转换。
| 类型 | 可转换为 | 
|---|---|
| Byte | Sbyte | 
| SByte | Byte、UInt16、UInt32、UInt64 | 
| Int16 | Byte、SByte、UInt16 | 
| UInt16 | Byte、SByte、Int16 | 
| Int32 | Byte、SByte、Int16、UInt16、UInt32 | 
| UInt32 | Byte、SByte、Int16、UInt16、Int32 | 
| Int64 | Byte、SByte、Int16、UInt16、Int32、UInt32、UInt64 | 
| UInt64 | Byte、SByte、Int16、UInt16、Int32、UInt32、Int64 | 
| Decimal | Byte、SByte、Int16、UInt16、Int32、UInt32、Int64、UInt64 | 
| Single | Byte、SByte、Int16、UInt16、Int32、UInt32、Int64、UInt64 | 
| Double | Byte、SByte、Int16、UInt16、Int32、UInt32、Int64、UInt64 |