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を返す標準的なパブリック メソッドですStringObject基本型によってオーバーライド可能として定義されているメソッドです。したがって、各クラスはそのメソッドをオーバーライドして、必要なものを何でも返すことができます。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

CStr() が受け入れる式の種類については、このMSDN ライブラリの記事で詳しく説明されています。要約:

  • 「True」または「False」に変換されたブール値を生成する式
  • 短い日時形式に変換された DateTime を生成する式
  • 数値を表す文字列に変換された数値型を生成する式。

列挙型の箇条書きがないことに注意してください。コンパイラは常に enum 値を整数に変換します。したがって、3 番目の箇条書きが適用され、これが「0」を取得する理由です。

于 2012-12-23T18:04:50.290 に答える