Top / .NET備忘録 / 99.小ネタ / 07.Object を String に変換

Object を String に変換するとき、どうやってますか?

ToString() メソッドだと、列挙体を変換したとき、値でなくて名称になってしまうので、ちと困ってしまいます。

    Private Enum Hoge
        Foo
        Bar
    End Enum
 
    Sub Main()
        Dim objectValue As Object
        Dim stringValue As String
 
        objectValue = Hoge.Bar
        stringValue = objectValue.ToString()
 
        MsgBox(stringValue)    ' ← "Bar" と表示される
    End Sub

ところが Option Strict Off にして Object を直接 String に代入すると

        objectValue = Hoge.Bar
        stringValue = objectValue
 
        MsgBox(stringValue)    ' ← "1" と表示される

てな感じになります。

コンパイラはどういうふうに変換してるのかな?というときに、頼りになるのが逆コンパイラです。

JustDecompile で逆コンパイルした結果

 Imports Microsoft.VisualBasic
 Imports Microsoft.VisualBasic.CompilerServices
 Imports System
 
 Namespace Application1
     <StandardModule>
     Friend NotInheritable Class Module1
         <STAThread>
         Public Shared Sub Main()
             Dim stringValue As String = Conversions.ToString(Module1.Hoge.Bar)
             Interaction.MsgBox(stringValue, MsgBoxStyle.OkOnly, Nothing)
         End Sub
 
         Private Enum Hoge
             Foo
             Bar
         End Enum
     End Class
 End Namespace

最適化されて objectValue がなくなってるなーとか、<StandardModule> とか <STAThread> がついてるなーとか、いろいろコンパイラがやってくれてるようですね。

本題に戻ると、Microsoft.VisualBasic.CompilerServices.Conversions クラスの ToString メソッドで変換されているのがわかります。




トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2013-11-13 (水) 23:58:25 (1438d)