隐式转换和显式转换 (Visual Basic)
“隐式转换”不需要源代码中的任何特殊语法。在下面的示例中,在将 k 的值赋给 q 之前,Visual Basic 将该值隐式转换成单精度浮点值。
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 |
任何数值类型(包括 Byte、SByte 和枚举类型)、String、Object |
|
CByte |
任何数值类型(包括 SByte 和枚举类型)、Boolean、String、Object |
|
CChar |
String, Object |
|
CDate |
String, Object |
|
CDbl |
任何数值类型(包括 Byte、SByte 和枚举类型)、Boolean、String、Object |
|
CDec |
任何数值类型(包括 Byte、SByte 和枚举类型)、Boolean、String、Object |
|
CInt |
任何数值类型(包括 Byte、SByte 和枚举类型)、Boolean、String、Object |
|
CLng |
任何数值类型(包括 Byte、SByte 和枚举类型)、Boolean、String、Object |
|
CObj |
任何类型 |
|
CSByte |
任何数值类型(包括 Byte 和枚举类型)、Boolean、String、Object |
|
CShort |
任何数值类型(包括 Byte、SByte 和枚举类型)、Boolean、String、Object |
|
CSng |
任何数值类型(包括 Byte、SByte 和枚举类型)、Boolean、String、Object |
|
CStr |
任何数值类型(包括 Byte, SByte 和枚举类型)、Boolean、Char、Char 数组、Date、Object |
|
CType |
逗号 (,) 后面指定的类型 |
当转换为“基本数据类型”(包括基本类型数组)时,相应转换关键字所允许的相同类型 当转换为“复合数据类型”时,其实现的接口和继承的类 当转换为一个已经在其上重载 CType 的类或结构时,该类或结构 |
CUInt |
任何数值类型(包括 Byte、SByte 和枚举类型)、Boolean、String、Object |
|
CULng |
任何数值类型(包括 Byte、SByte 和枚举类型)、Boolean、String、Object |
|
CUShort |
任何数值类型(包括 Byte、SByte 和枚举类型)、Boolean、String、Object |
CType 函数
CType 函数 (Visual Basic) 作用于两个参数。第一个参数是将要转换的表达式,第二个参数是目标数据类型或对象类。注意,第一个参数必须是表达式,不能是类型。
CType 是一个“内联函数”,这意味着转换是由已编译的代码执行的,通常不会生成函数调用。这将提高性能。
有关 CType 与其他类型转换关键字的比较,请参见 DirectCast 运算符 (Visual Basic) 和 TryCast 运算符 (Visual Basic)。
基本类型
下面的示例说明 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
有关更多信息及示例,请参见数组转换 (Visual Basic)。
定义 CType 的类型
您可以在已定义的类或结构上定义 CType。它允许将值转换为您的类或结构的类型,反之亦然。有关更多信息及示例,请参见如何:定义转换运算符 (Visual Basic)。
说明 |
---|
与转换关键字一起使用的值对于目标数据类型必须是有效的,否则将出错。例如,如果尝试将 Long 转换为 Integer,则 Long 的值必须在 Integer 数据类型的有效范围内。 |
警告 |
---|
如果源类型不从目标类型派生,则指定 CType 以从一个类类型转换为另一个类类型的操作将会失败。这种失败会引发 InvalidCastException 异常。 |
不过,如果其中一个类型是一个已定义的结构或类,并且如果已经在该结构或类上定义了 CType,则转换只要满足 CType 要求就会成功。请参见如何:定义转换运算符 (Visual Basic)。
执行显式转换即所谓的将表达式“强制转换”为给定的数据类型或对象类。
请参见
任务
如何:在 Visual Basic 中将一个对象转换为其他类型