隐式转换和显式转换 (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

Boolean 数据类型 (Visual Basic)

任何数值类型(包括 Byte、SByte 和枚举类型)、String、Object

CByte

Byte 数据类型 (Visual Basic)

任何数值类型(包括 SByte 和枚举类型)、Boolean、String、Object

CChar

Char 数据类型 (Visual Basic)

String, Object

CDate

Date 数据类型 (Visual Basic)

String, Object

CDbl

Double 数据类型 (Visual Basic)

任何数值类型(包括 Byte、SByte 和枚举类型)、Boolean、String、Object

CDec

Decimal 数据类型 (Visual Basic)

任何数值类型(包括 Byte、SByte 和枚举类型)、Boolean、String、Object

CInt

Integer 数据类型 (Visual Basic)

任何数值类型(包括 Byte、SByte 和枚举类型)、Boolean、String、Object

CLng

Long 数据类型 (Visual Basic)

任何数值类型(包括 Byte、SByte 和枚举类型)、Boolean、String、Object

CObj

Object 数据类型

任何类型

CSByte

SByte 数据类型 (Visual Basic)

任何数值类型(包括 Byte 和枚举类型)、Boolean、String、Object

CShort

Short 数据类型 (Visual Basic)

任何数值类型(包括 Byte、SByte 和枚举类型)、Boolean、String、Object

CSng

Single 数据类型 (Visual Basic)

任何数值类型(包括 Byte、SByte 和枚举类型)、Boolean、String、Object

CStr

String 数据类型 (Visual Basic)

任何数值类型(包括 Byte, SByte 和枚举类型)、Boolean、Char、Char 数组、Date、Object

CType

逗号 (,) 后面指定的类型

当转换为“基本数据类型”(包括基本类型数组)时,相应转换关键字所允许的相同类型

当转换为“复合数据类型”时,其实现的接口和继承的类

当转换为一个已经在其上重载 CType 的类或结构时,该类或结构

CUInt

UInteger 数据类型

任何数值类型(包括 Byte、SByte 和枚举类型)、Boolean、String、Object

CULng

ULong 数据类型 (Visual Basic)

任何数值类型(包括 Byte、SByte 和枚举类型)、Boolean、String、Object

CUShort

UShort 数据类型 (Visual Basic)

任何数值类型(包括 Byte、SByte 和枚举类型)、Boolean、String、Object

CType 函数

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

CType 是一个“内联函数”,这意味着转换是由已编译的代码执行的,通常不会生成函数调用。这将提高性能。

有关 CType 与其他类型转换关键字的比较,请参见 DirectCast 运算符 (Visual Basic)TryCast 运算符 (Visual Basic)

kca3w8x6.collapse_all(zh-cn,VS.110).gif基本类型

下面的示例说明 CType 的用法。

k = CType(q, Integer)
' The following statement coerces w to the specific object class Label.
f = CType(w, Label)

kca3w8x6.collapse_all(zh-cn,VS.110).gif复合类型

可以使用 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)

kca3w8x6.collapse_all(zh-cn,VS.110).gif数组类型

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)

kca3w8x6.collapse_all(zh-cn,VS.110).gif定义 CType 的类型

您可以在已定义的类或结构上定义 CType。它允许将值转换为您的类或结构的类型,反之亦然。有关更多信息及示例,请参见如何:定义转换运算符 (Visual Basic)

说明说明

与转换关键字一起使用的值对于目标数据类型必须是有效的,否则将出错。例如,如果尝试将 Long 转换为 Integer,则 Long 的值必须在 Integer 数据类型的有效范围内。

警告说明警告

如果源类型不从目标类型派生,则指定 CType 以从一个类类型转换为另一个类类型的操作将会失败。这种失败会引发 InvalidCastException 异常。

不过,如果其中一个类型是一个已定义的结构或类,并且如果已经在该结构或类上定义了 CType,则转换只要满足 CType 要求就会成功。请参见如何:定义转换运算符 (Visual Basic)

执行显式转换即所谓的将表达式“强制转换”为给定的数据类型或对象类。

请参见

任务

如何:在 Visual Basic 中将一个对象转换为其他类型

数据类型疑难解答 (Visual Basic)

参考

数据类型摘要 (Visual Basic)

类型转换函数 (Visual Basic)

概念

字符串和其他类型之间的转换 (Visual Basic)

其他资源

Visual Basic 中的类型转换

结构 (Visual Basic)