隐式和显式转换 (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 布尔数据类型 任何数值类型(包括ByteSByte和枚举类型), StringObject
CByte 字节数据类型 任何数值类型(包括SByte和枚举类型)、Boolean、、 StringObject
CChar Char 数据类型 StringObject
CDate 日期数据类型 StringObject
CDbl Double 数据类型 任何数值类型(包括ByteSByte和枚举类型)、Boolean、、 StringObject
CDec 十进制数据类型 任何数值类型(包括ByteSByte和枚举类型)、Boolean、、 StringObject
CInt 整数数据类型 任何数值类型(包括ByteSByte和枚举类型)、Boolean、、 StringObject
CLng 长数据类型 任何数值类型(包括ByteSByte和枚举类型)、Boolean、、 StringObject
CObj 对象数据类型 任意类型
CSByte SByte 数据类型 任何数值类型(包括Byte和枚举类型)、Boolean、、 StringObject
CShort 短数据类型 任何数值类型(包括ByteSByte和枚举类型)、Boolean、、 StringObject
CSng 单个数据类型 任何数值类型(包括ByteSByte和枚举类型)、Boolean、、 StringObject
CStr 字符串数据类型 任何数值类型(包括 ByteSByte和枚举类型)、 BooleanChar数组 CharDateObject
CType 在逗号后指定的类型 (, 转换为基本数据类型(包括基本类型的数组)时,对应的转换关键字所允许的类型相同

转换为复合数据类型时,它实现的接口及其继承的类

转换为重载 CType 的类或结构时,该类或结构
CUInt UInteger 数据类型 任何数值类型(包括ByteSByte和枚举类型)、Boolean、、 StringObject
CULng ULong 数据类型 任何数值类型(包括ByteSByte和枚举类型)、Boolean、、 StringObject
CUShort UShort 数据类型 任何数值类型(包括ByteSByte和枚举类型)、Boolean、、 StringObject

CType 函数

CType 函数作用于两个参数。 第一个是要转换的表达式,第二个是目标数据类型或对象类。 请注意,第一个参数必须是表达式,而不是类型。

CType一个内联函数,这意味着编译的代码进行转换,通常不生成函数调用。 从而可以提高性能。

CType 与其他类型转换关键字进行比较,请参阅 DirectCast 运算符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要求,转换可能会成功。 参见 :如何定义转换运算符

执行显式转换也称为将表达式 强制转换为 给定数据类型或对象类。

另请参阅