在 Object 数据类型之间来回转换时,DirectCast 不使用 Visual Basic 运行时帮助器例程进行转换,因此它可以提供比 CType 更好一些的性能。
使用 DirectCast 关键字的方法与使用 CType 函数和 TryCast 关键字相同。提供一个表达式作为第一个参数,提供一个类型以将它转换为第二个参数。DirectCast 需要两个参数的数据类型之间的继承或实现关系。这意味着一个类型必须继承或实现另一个类型。
如果 DirectCast 检测到不存在继承或实现关系,则生成一个编译器错误。但是没有出现编译器错误并不能保证肯定进行了成功的转换。如果需要的转换为收缩转换,则可能在运行时失败。如果发生这种状况,运行库会引发一个 InvalidCastException 错误。
类型转换关键字的对比如下。
关键字 | 数据类型 | 参数关系 | 运行时故障 |
---|---|---|---|
任何数据类型 |
必须在两种数据类型之间定义扩大转换或收缩转换 |
引发 InvalidCastException | |
DirectCast |
任何数据类型 |
一个类型必须继承或者实现另一个类型 |
引发 InvalidCastException |
仅引用类型 |
一个类型必须继承或者实现另一个类型 |
下面的示例演示 DirectCast 的两种用法,一种在运行时发生失败,另一种取得成功。
Dim q As Object = 2.37 Dim i As Integer = CType(q, Integer) ' The following conversion fails at run time Dim j As Integer = DirectCast(q, Integer) Dim f As New System.Windows.Forms.Form Dim c As System.Windows.Forms.Control ' The following conversion succeeds. c = DirectCast(f, System.Windows.Forms.Control)
以上示例中,q 的运行时类型为 Double。CType 能够成功是因为 Double 可被转换为 Integer。但是,第一个 DirectCast 在运行时失败是因为 Double 的运行时类型与 Integer 没有继承关系,即使是可以进行转换。第二个 DirectCast 成功是因为它从 Form 类型转换为 Control 类型,而 Form 继承自该类型。