隐式转换和显式转换 (Visual Basic)
隐式转换不需要在源代码中使用任何特殊语法。 在以下示例中,Visual Basic 将 k
的值隐式转换为单精度浮点值,然后再将其分配给 q
。
Dim k As Integer
Dim q As Double
' Integer widens to Double, so you can do this with Option Strict On.
k = 432
q = k
显式转换使用类型转换关键字。 Visual Basic 提供了几个这样的关键字,它们将括号中的表达式强制转换为所需的数据类型。 这些关键字的作用类似于函数,但编译器会内联生成代码,因此执行速度比函数调用稍快。
在前面示例的以下扩展中,CInt
关键字将 q
的值转换回整数,然后再将其分配给 k
。
' q had been assigned the value 432 from k.
q = Math.Sqrt(q)
k = CInt(q)
' k now has the value 21 (rounded square root of 432).
转换关键字
下表显示了可用的转换关键字。
类型转换关键字 | 将表达式转换为数据类型 | 允许转换的表达式数据类型 |
---|---|---|
CBool |
Boolean 数据类型 | 任何数字类型(包括 Byte 、SByte 和枚举类型)、String 、Object |
CByte |
Byte 数据类型 | 任何数字类型(包括 SByte 和枚举类型)、Boolean 、String 、Object |
CChar |
Char 数据类型 | String ,Object |
CDate |
Date 数据类型 | String ,Object |
CDbl |
Double 数据类型 | 任何数字类型(包括 Byte 、SByte 和枚举类型)、Boolean 、String 、Object |
CDec |
Decimal 数据类型 | 任何数字类型(包括 Byte 、SByte 和枚举类型)、Boolean 、String 、Object |
CInt |
Integer 数据类型 | 任何数字类型(包括 Byte 、SByte 和枚举类型)、Boolean 、String 、Object |
CLng |
Long 数据类型 | 任何数字类型(包括 Byte 、SByte 和枚举类型)、Boolean 、String 、Object |
CObj |
Object Data Type | 任何类型 |
CSByte |
SByte 数据类型 | 任何数字类型(包括 Byte 和枚举类型)、Boolean 、String 、Object |
CShort |
Short 数据类型 | 任何数字类型(包括 Byte 、SByte 和枚举类型)、Boolean 、String 、Object |
CSng |
Single 数据类型 | 任何数字类型(包括 Byte 、SByte 和枚举类型)、Boolean 、String 、Object |
CStr |
String 数据类型 | 任何数字类型(包括 Byte 、SByte 和枚举类型)、Boolean 、Char 、Char 数组、Date 、Object |
CType |
在逗号 (, ) 后面指定的类型 |
转换为基本数据类型(包括基本类型的数组)时,对应的转换关键字所允许的类型相同 转换为复合数据类型时,它实现的接口及其继承的类 转换为重载 CType 的类或结构时,该类或结构 |
CUInt |
UInteger 数据类型 | 任何数字类型(包括 Byte 、SByte 和枚举类型)、Boolean 、String 、Object |
CULng |
ULong 数据类型 | 任何数字类型(包括 Byte 、SByte 和枚举类型)、Boolean 、String 、Object |
CUShort |
UShort 数据类型 | 任何数字类型(包括 Byte 、SByte 和枚举类型)、Boolean 、String 、Object |
CType 函数
CType 函数使用两个参数。 第一个是要转换的表达式,第二个是目标数据类型或对象类。 请注意,第一个参数必须是表达式,而不是类型。
CType
是内联函数,这意味着编译后的代码会进行转换,通常不会生成函数调用。 从而可以提高性能。
有关 CType
与其他类型转换关键字的比较,请参阅 CType
和 TryCast 运算符。
基本类型
以下示例演示了 CType
的用法。
k = CType(q, Integer)
' The following statement coerces w to the specific object class Label.
f = CType(w, Label)
复合类型
你可以使用 CType
将值转换为复合数据类型以及基本类型。 还可以使用它将对象类强制转换为其接口之一的类型,如以下示例所示。
' Assume class cZone implements interface iZone.
Dim h As Object
' The first argument to CType must be an expression, not a type.
Dim cZ As cZone
' The following statement coerces a cZone object to its interface iZone.
h = CType(cZ, iZone)
数组类型
CType
还可以转换数组数据类型,如以下示例所示。
Dim v() As classV
Dim obArray() As Object
' Assume some object array has been assigned to obArray.
' Check for run-time type compatibility.
If TypeOf obArray Is classV()
' obArray can be converted to classV.
v = CType(obArray, classV())
End If
有关详细信息和示例,请参阅数组转换。
定义 CType 的类型
你可以在已定义的类或结构上定义 CType
。 这使你可以在值与类或结构的类型之间进行转换。 有关详细信息和示例,请参阅如何定义转换运算符。
注意
与转换关键字一起使用的值必须对目标数据类型有效,否则会发生错误。 例如,如果尝试将 Long
转换为 Integer
,则 Long
的值必须在 Integer
数据类型的有效范围内。
注意
如果源类型不是从目标类型派生的,则指定 CType
以从一种类类型转换为另一种会在运行时失败。 此类失败会引发 InvalidCastException 异常。
但是,如果其中一种类型是你已定义的结构或类,并且你已在该结构或类上定义了 CType
,则如果它满足你的 CType
的要求,则转换可能会成功。 请参阅如何定义转换运算符。
执行显式转换也称为将表达式转换为给定的数据类型或对象类。