Vb.net 处理枚举类型时,将CStr()与.ToString进行比较

Vb.net 处理枚举类型时,将CStr()与.ToString进行比较,vb.net,Vb.net,我(显然是错误地)假设Cstr(某物)等同于某物 我想将枚举类型作为字符串保存,似乎根据我使用的转换方法,我可以获取enum的索引或名称: Public Enum vehicleType Car Lorry Bicycle End Enum Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handle

我(显然是错误地)假设Cstr(某物)等同于
某物
我想将枚举类型作为字符串保存,似乎根据我使用的转换方法,我可以获取
enum
的索引或名称:

Public Enum vehicleType
    Car
    Lorry
    Bicycle
End Enum

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        MsgBox("Index is " & _
               CStr(vehicleType.Car) & _
               ".Name is " & _
               vehicleType.Car.ToString)
    End Sub
End Class

为什么这些对字符串的转换会返回
enum
类型的不同元素?

本文将详细解释CStr()接受哪种类型的表达式。总结:

  • 生成布尔值的表达式,转换为“真”或“假”
  • 生成日期时间的表达式,转换为短日期时间格式
  • 生成数字类型的表达式,转换为表示数字的字符串

请注意,它没有枚举类型的项目符号。编译器总是乐于将枚举值转换为整数。所以第三个项目符号适用,这就是为什么会得到“0”

ToString
方法是一个标准的公共方法,它返回一个
字符串
。它是一种由基
对象
类型定义为可重写的方法。因此,每个类都可以重写该方法以返回它想要的任何内容。类重写
ToString
方法以使其返回一个良好的可读对象描述是很常见的

另一方面,CStr是铸造操作员。它是
CType(x,String)
的缩写。与许多其他操作符一样,强制转换操作符可以被任何类重写。但是,通常情况下,您希望强制转换操作返回原始对象实际值的最接近表示形式,而不是描述性字符串

因此,您可能希望
ToString
返回与
CStr
不同的结果,这并不罕见。对于枚举,每个成员本质上都是一个整数,因此枚举成员上的
CStr
与整数上的
CStr
工作原理相同。这就是你所期望的。但是,
ToString
已被重写,以返回更易于阅读的值版本。这也是你所期望的

下面是一个覆盖
CStr
ToString
的类的示例:

Public Class MyClass
    Public Overrides Function ToString()
        Return "Result from ToString"
    End Function

    Public Shared Widening Operator CType(ByVal p1 As MyClass) As String
        Return "Result from cast to String"
    End Operator
End Class

+1-另外-我用来获取枚举名称的代码是正确的
vehicleType.Car.ToString
?+1非常好-再次感谢。没有意识到
CStr、CInt…等
CType
的简短版本。很抱歉我的格式设置。我想提供一个在一个类中同时覆盖这两个方面的例子,但是我在车里打电话,所以太难了。我以后会设法把它修好(除非有人想帮我一把,先帮我修好:)……史蒂夫,不要着急,我期待着更多的信息
SO
在车内的手机上……
SO
是危险的上瘾!!哈这是一个有趣的心理形象!不,我妻子在开车。我的右脚骨折了,所以戴着石膏不能开车。但是,如果我是开车的话,我可能仍然会有冲动去打字,比如说演员超载。我可能让我妻子帮我打字了!。。。喜欢你的风格,史蒂文。p、 你好像没有圣诞帽?