6

我(显然是错误的)假设这Cstr(something)相当于something.ToString.
我想将枚举类型作为字符串保存,似乎取决于我使用的转换方法,我要么得到索引,要么得到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类型的不同元素?

4

2 回答 2

6

ToString方法是一个标准的公共方法,它返回一个String. 它是一种由基Object类型定义为可覆盖的方法。因此,每个类都可以重写该方法以返回它想要的任何东西。类重写该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
于 2012-12-23T18:07:41.573 回答
1

这篇MSDN Library 文章详细解释了 CStr() 接受的表达式类型。总结:

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

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

于 2012-12-23T18:04:50.290 回答