VB6 Cast表达式

11
在Visual Basic 6中,CType的类型转换表达式等价于什么?

问题措辞不太清楚,因为CType既可以进行强制转换也可以进行转换。所以这个问题有一半是关于强制转换,另一半是关于转换的。例如,CType("1",Integer)返回整数1。 - MarkJ
1
我认为这个问题的关键在于VB6中内置的隐式类型转换与CType()几乎做了相同的事情。它尝试进行强制转换,或者对于值类型,它尝试进行转换。因此,我认为在VB6中最接近CType的真正方法就是直接赋值或设置语句! - MarkJ
6个回答

19

许多海报似乎误读了问题,因此我将尝试通过重新表述问题并总结到目前为止给出的正确答案来澄清一些事情。

问题

我想将一个类型的数据转换为另一种类型。在我的VB.NET代码中,我会使用CType来实现这一点。然而,当我尝试在VB6中使用CType时,我会收到“子或函数未定义”错误。那么,在VB6中如果CType无法工作,我该如何执行转换?

解决方案

正如您可能已经发现的那样,VB6没有像VB.NET一样的CType函数。然而,其他转换函数(那些以C开头命名的函数),您可能在VB.NET代码中遇到过,如CInt和CStr,在VB6中确实存在,您可以使用它们来转换非对象类型。VB6没有内置功能将一个类的对象转换为另一个类的对象。请记住,与VB.NET不同,VB6不支持继承。在VB6中,一个类可以实现一个或多个接口,但它不能从另一个类继承。但是,如果一个对象的类实现了多个接口,则可以使用Set语句将对象转换为其支持的接口之一(如Ant建议的那样)。下面提供了一个Ant代码示例的扩展版本:

示例:将类强制转换为其支持的接口之一

Dim base As BaseClass
Dim child As ChildClass     'implements BaseClass'

Set child = New ChildClass 
Set base = child            '"Cast" child to BaseClass'

VB6中的内置类型转换函数

以下是 VB6 帮助文件中直接提取的所有内置转换函数的完整列表。


CBool

返回

Boolean

描述

expression 转换为 Boolean 类型。

expression 参数的取值范围:

任何有效的字符串或数值表达式。


CByte

返回

Byte

描述

expression 转换为 Byte 类型。

expression 参数的取值范围:

0 到 255。


CCur

返回

Currency

描述

expression 转换为 Currency 类型。

expression 参数的取值范围:

-922,337,203,685,477.5808 到 922,337,203,685,477.5807。


CDate

返回

Date

描述

expression 转换为 Date 类型。

expression 参数的取值范围:

任何有效的日期表达式。


CDbl

返回

Double

描述

expression 转换为 Double 类型。

expression 参数的取值范围:

负数范围为 -1.79769313486232E308 到 -4.94065645841247E-324,正数范围为 4.94065645841247E-324 到 1.79769313486232E308。


CDec

返回

Decimal

描述

expression 转换为 Decimal 类型。

expression 参数的取值范围:

零比例数字的范围为 +/-79,228,162,514,264,337,593,543,950,335,即没有小数位的数字。对于具有 28 个小数位的数字,范围为 +/-7.9228162514264337593543950335。最小可能非零数字为 0.0000000000000000000000000001。


CInt

返回

Integer

描述


19

根据您所转换的类型,它们的数量可能会有所不同。

cint() Cast to integer
cstr() cast to string
clng() cast to long
cdbl() cast to double
cdate() cast to date

它还具有隐式转换,因此您可以执行此操作myString=myInt


如果去掉 CType,那么这个答案就是正确的。原帖想要的是 VB6 中等效的 CType。C 类型转换函数(如 CInt 等)在 VB6 和 VB.NET 中都可用;然而 CType 只在 VB.NET 中可用。在 VB6 中没有 CType 函数... - Mike Spross
2
另外还有CBool、CByte、CCur、CDec、CSng和CVar。 - onedaywhen

5
假设您有一个ChildClass(child)的对象,您想将其转换为BaseClass。您可以这样做:
Dim base As BaseClass
Set base = child

由于VB6处理编译时类型安全的方式,您可以在不需要任何额外语法的情况下执行该操作。

注意:鉴于其他人似乎都提到了 CType ,如果我完全误解了问题,我向您道歉!


2

已经提到的类型是正确的,但如果类型是一个对象,则必须在VB6中使用"Set",例如:

If IsObject(Value) Then
    Set myObject = Value ' VB6 does not have CType(Value, MyObjectType)
Else
    myObject = Value     ' VB6 does not have CType(Value, MyObjectType)
End If

当然,这取决于您要转换的类型。几乎所有用户类都是对象,例如Collection、Dictionary等等。而像long、integer、boolean等内置类型显然不是对象。

OP要求VB6,而你发布的示例是VB.NET。 - Mike Spross
我没想起来 CType 转换,所以很明显这是 VB.NET。然而关于 IsObject(myObject) 的语句仍然是有效且相关的。我评论是为了提醒大家注意,在 VB6 中必须使用 "Set" 将对象分配给变量,但你没有理解重点。 - Ryan

0

我相信是Ctype()。C*(如CDate()、CStr()等)大多数都是遗留下来的。


不好意思,在VB6中没有CType。OP想要的是.NET CType函数在VB6中的等价物。建议您删除此答案。 - MarkJ
不,我不需要篡改历史来让自己看起来更好。我只是把问题倒过来读了一遍,尽管我可以发誓我以前用过它。 - StingyJack

0

转换根本不是“强制转换”。例如尝试:

MsgBox CLng(CBool(3&))

结果是-1,而不是3。这是因为它们是转换函数,而不是强制转换。语言很重要!


是的。然而,这个问题措辞不太清晰,因为CType既可以进行类型转换又可以进行强制转换。所以这个问题有一半是关于强制转换的,另一半是关于类型转换的。例如,CType("1",Integer) 将返回整数1。 - MarkJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接