F# ではLiteral属性がついている束縛はpublic constなフィールドになる

F# の内部表現的な話。 前にどこかで人に尋ねられたことがあったので備忘として。

[<Literal>]
let foo = 1

こんなコードを書くと

[Literal]
public const int foo = 1;

こういうコードとだいたい同じILになるよ(実際には他にもコンパイルが勝手に付与する属性があるかも)というただそれだけの話。

ちなみに

let foo = 1

これは

public static int foo
{
    get
    {
        return 1;
    }
}

だいたいこれと同じ(本当はコンパイラが自動付与する属性があるわけだが面倒なので記述を避けた)。