列挙型でちょっとビックリ

プログラミングC# 第6版 3.3


列挙型の話。これはC++とまったく同じですね。

ってことでサクっと実行してみたところ・・・

using System;

enum Hoge {
    Foo,
    Bar,
    Baz,
}

class Program {
    static void Main () {
        Console.WriteLine(Hoge.Foo);
        Console.WriteLine(Hoge.Bar);
        Console.WriteLine(Hoge.Baz);
    }
}
$ main
Foo
Bar
Baz

なん・・・だと・・・。

0,1,2と表示されるはずが、なぜか名称がそのまま表示されてしまいました!

ということでこの不可解な結果を調べてみたところ、理由がわかりました。

Console.WriteLineは引数に与えられた値のToStringというメソッドを自動的に呼ぶそうです。

そしてHoge.Foo.ToString()は0を返すわけではなく、自分自身の名称を返す仕様になっているので出力結果が上記のようになってしまったというわけです。

さてこれを正しく表示させるにはキャストが必要だということです。

class Program {
    static void Main () {
        // intへキャストする
        Console.WriteLine((int)Hoge.Foo);
        Console.WriteLine((int)Hoge.Bar);
        Console.WriteLine((int)Hoge.Baz);
    }
}
$ main
0
1
2

うまく表示されましたね。

あとC#enumですが、enumの元となる整数型を指定できるみたいです。たぶんC++にはそんな機能はなかったと思うんですが。

// デフォルトintの代わりにlongを使用
enum Hoge : long {
    Foo,
    Bar,
    Baz,
}

あまり使うケースが思い浮かばないですが、こういう機能もあるということで。