I did a couple of experiments with the F# compiler an here are some my observations. If you want to create IL literal, then you need to place the value marked as a Literal
inside a module. For example like this:
module Constants =
[<Literal>]
let Num = 1
As a side-note, I did a quick search through the F# specification and it seems that literals can be very useful for pattern matching, because you can use them as a pattern (as long as they start with an uppercase letter):
open Constants
match 1 with
| Num -> "1"
| _ -> "other"
Now, the question is, why Literal
doesn't behave as you would expect when you place it inside a type declaration. I think the reason is that let
declaration inside an F# type declaration cannot be public and will be visible only inside the class/type. I believe that both C# and F# inline literal values when you use them and this is done inside type declarations too. However since the literal cannot be public, there is no reason for generating the literal
IL field, because nobody could ever access it.