隐式转换和显式转换 (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 数据类型 任何数字类型(包括 ByteSByte 和枚举类型)、StringObject
CByte Byte 数据类型 任何数字类型(包括 SByte 和枚举类型)、BooleanStringObject
CChar Char 数据类型 StringObject
CDate Date 数据类型 StringObject
CDbl Double 数据类型 任何数字类型(包括 ByteSByte 和枚举类型)、BooleanStringObject
CDec Decimal 数据类型 任何数字类型(包括 ByteSByte 和枚举类型)、BooleanStringObject
CInt Integer 数据类型 任何数字类型(包括 ByteSByte 和枚举类型)、BooleanStringObject
CLng Long 数据类型 任何数字类型(包括 ByteSByte 和枚举类型)、BooleanStringObject
CObj Object Data Type 任何类型
CSByte SByte 数据类型 任何数字类型(包括 Byte 和枚举类型)、BooleanStringObject
CShort Short 数据类型 任何数字类型(包括 ByteSByte 和枚举类型)、BooleanStringObject
CSng Single 数据类型 任何数字类型(包括 ByteSByte 和枚举类型)、BooleanStringObject
CStr String 数据类型 任何数字类型(包括 ByteSByte 和枚举类型)、BooleanCharChar 数组、DateObject
CType 在逗号 (,) 后面指定的类型 转换为基本数据类型(包括基本类型的数组)时,对应的转换关键字所允许的类型相同

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

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

CType 函数

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

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

有关 CType 与其他类型转换关键字的比较,请参阅 CTypeTryCast 运算符

基本类型

以下示例演示了 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 的要求,则转换可能会成功。 请参阅如何定义转换运算符

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

另请参阅