C#

enum.ToString() はコンパイル時に置き換えられる?

enumは定数に置き換えられるけど、ToString() してるのはどうなんだろう?

下のようなコードで MyENUM.A.ToString() の部分はコンパイル時に分かる気がしたので、これが予め文字列に置き換えられるか調べてみました。
var s = "A" みたいなILが出力されているのを期待しています。

public enum MyENUM
{
    A,
    B
}

class MainClass
{
    public static void Main(string[] args)
    {
        var s = MyENUM.A.ToString();

        Console.WriteLine(s);
    }
}

mcs (ver4.8.0.0) の最適化フラグ付きでコンパイル、monodis (バージョン不明)で逆アセンブルしました。

みたところ、律儀にToString()で文字列化するようですね。
000aの callvirt instance string object::ToString() が該当箇所ですが、期待としては ldstr "A" となるところでした。残念。。

        .entrypoint
        // Code size 23 (0x17)
        .maxstack 1
        .locals init (
                string  V_0,
                valuetype MyENUM  V_1)
        IL_0000:  ldc.i4.0 
        IL_0001:  stloc.1 
        IL_0002:  ldloca.s 1
        IL_0004:  constrained. MyENUM
        IL_000a:  callvirt instance string object::ToString()
        IL_000f:  stloc.0 
        IL_0010:  ldloc.0 
        IL_0011:  call void class [mscorlib]System.Console::WriteLine(string)
        IL_0016:  ret 

他のコンパイラはどうなんでしょうねー?

追記 (デキタ!)

nameof演算子があるのを指摘いただきました。以下のようにすることで、期待通りのコードが出力されたのを確認しました。

var s = nameof(MyENUM.A);

Console.WriteLine(s);