vb.net中三种转换[CType/DirectCast/TryCast],到了C#下面TryCast对应as,但是DirectCast +TryCast都变成了(type)var 一种形式,
看来vb.net和C#不完全相等啊,不知道大家怎么理解
三种转换看这个列表就能知道区别了:
CType 函数
任何数据类型
必须在两种数据类型之间定义扩大转换或收缩转换
引发 InvalidCastException
DirectCast
任何数据类型
一个类型必须继承自或者实现另一个类型
引发 InvalidCastException
TryCast
仅引用类型
一个类型必须继承或者实现另一个类型
返回 Nothing (Visual Basic)
MSDN中说得更详细:
========================= from MSDN==========================================================
--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
DirectCast
在 Object 数据类型之间来回转换时,DirectCast 不使用 Visual Basic 运行时帮助器例程进行转换,因此它可以提供比 CType 更好一些的性能。
使用 DirectCast 关键字的方法与使用 CType 函数 和 TryCast 关键字相同。提供一个表达式作为第一个参数,提供一个类型以将它转换为第二个参数。DirectCast 需要两个参
数的数据类型之间的继承或实现关系。这意味着一个类型必须继承或实现另一个类型。
错误和失败
如果 DirectCast 检测到不存在继承或实现关系,则生成一个编译器错误。但是没有出现编译器错误并不能保证肯定进行了成功的转换。如果需要的转换为收缩转换,则可能在运
行时失败。如果发生这种状况,运行库会引发一个 InvalidCastException 错误。
转换关键字
类型转换关键字的对比如下。
关键字
数据类型
参数关系
运行时失败
CType 函数
任何数据类型
必须在两种数据类型之间定义扩大转换或收缩转换
引发 InvalidCastException
DirectCast
任何数据类型
一个类型必须继承自或者实现另一个类型
引发 InvalidCastException
TryCast
仅引用类型
一个类型必须继承或者实现另一个类型
返回 Nothing (Visual Basic)
示例
下面的示例演示 DirectCast 的两种用法,一种在运行时发生失败,另一种取得成功。
Visual Basic 复制代码
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 继承自该类型。
--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
CType 函数
更新:2007 年 11 月
返回表达式显式地转换为指定数据类型、对象、结构、类或接口后的结果。
CType(expression,typename)
各部分说明
expression
任何有效的表达式。如果 expression 的值超出 typename 允许的范围,Visual Basic 将引发异常。
typename
任何在 Dim 语句的 As 子句内合法的表达式,即任何数据类型、对象、结构、类或接口的名称。
备注
CType 采用内联方式编译,即转换代码是计算表达式的代码的一部分。在某些情况下不需要调用一个过程来完成转换,这会使执行速度更快。
如果没有定义从 expression 到 typename 的转换,例如从 Integer 转换到 Date,Visual Basic 将显示一条编译时错误信息。
如果在运行时转换失败,将会引发相应的异常。如果收缩转换失败,最常见的结果是 OverflowException。如果未定义转换,将会发生 InvalidCastException。例如,如果
expression 的类型为 Object,并且其运行时类型没有转换为 typename,则可能会发生这种情况。
如果 expression 或 typename 的数据类型为已经定义的类或结构,则可以在该类或结构中将 CType 定义为转换运算符。这将使 CType 用作重载运算符。如果这样做,则可以控
制转换在类或结构之间进行的转换的行为,包括可能引发的异常。
重载
CType 运算符也可以在代码之外定义的类或结构中重载。如果您的代码需要在这样的类或结构之间进行转换,请确定您了解其 CType 运算符的行为。有关更多信息,请参见运算符
过程。
示例
下面的示例使用 CType 函数将表达式转换为指定的数据类型。
Visual Basic 复制代码
Dim testNumber As Long = 1000
' The following line of code sets testNewType to 1000.0.
Dim testNewType As Single = CType(testNumber,Single)
--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
TryCast
引入不引发异常的类型转换操作。
备注
如果尝试转换失败,则 CType 和 DirectCast 都会引发 InvalidCastException 错误。这将给应用程序的性能造成负面影响。TryCast 返回 Nothing (Visual Basic),因此只需
测试返回的结果是否为 Nothing,而无需处理可能产生的异常。
使用 TryCast 关键字的方法与使用 CType 函数和 DirectCast 关键字的方法相同。提供一个表达式作为第一个参数,并提供要将其转换成的类型作为第二个参数。TryCast 仅适
用于引用类型,如类和接口。它要求这两种类型之间的关系为继承或实现。这意味着一个类型必须继承自或实现另一个类型。
错误和失败
如果 TryCast 检测到不存在任何继承或实现关系,它将生成一个编译器错误。但是不出现编译器错误并不能保证转换成功。如果需要的转换为收缩转换,它可能在运行时失败。如
果发生这种情况,TryCast 返回 Nothing (Visual Basic)。
转换关键字
以下是类型转换关键字的对比。
关键字 数据类型 参数关系 运行时失败
CType 函数
任何数据类型
必须在两种数据类型之间定义扩大转换或收缩转换
引发 InvalidCastException
DirectCast
任何数据类型
一个类型必须继承自或者实现另一个类型
引发 InvalidCastException
TryCast
仅引用类型
一个类型必须继承自或者实现另一个类型
返回 Nothing (Visual Basic)。
示例
下面的示例显示如何使用 TryCast。
Visual Basic 复制代码 Function PrintTypeCode(ByVal obj As Object) As String Dim objAsConvertible As IConvertible = TryCast(obj,IConvertible) If objAsConvertible Is Nothing Then Return obj.ToString() & " does not implement IConvertible" Else Return "Type code is " & objAsConvertible.GetTypeCode() End If End Function