隐式转换不需要源代码中的任何特殊语法。 在下面的示例中,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 |
布尔数据类型 | 任何数值类型(包括Byte 、SByte 和枚举类型), String Object |
CByte |
字节数据类型 | 任何数值类型(包括SByte 和枚举类型)、Boolean 、、 String Object |
CChar |
Char 数据类型 |
String 、Object |
CDate |
日期数据类型 |
String 、Object |
CDbl |
Double 数据类型 | 任何数值类型(包括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 |
SByte 数据类型 | 任何数值类型(包括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 |
UInteger 数据类型 | 任何数值类型(包括Byte 、SByte 和枚举类型)、Boolean 、、 String Object |
CULng |
ULong 数据类型 | 任何数值类型(包括Byte 、SByte 和枚举类型)、Boolean 、、 String Object |
CUShort |
UShort 数据类型 | 任何数值类型(包括Byte 、SByte 和枚举类型)、Boolean 、、 String Object |
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
要求,转换可能会成功。 参见 :如何定义转换运算符。
执行显式转换也称为将表达式 强制转换为 给定数据类型或对象类。