在C#中,可以像这样定义一个类型成员常量:
class Foo { public const int Bar = 600; }
Run Code Online (Sandbox Code Playgroud)
IL看起来像这样.
.field public static literal int32 Bar = int32(600)
Run Code Online (Sandbox Code Playgroud)
我如何在Visual F#/ FSharp中做同样的事情?
我试过这个无济于事:
[<Sealed>]
type Foo() =
[<Literal>]
let Bar = 600
Run Code Online (Sandbox Code Playgroud)
Tom*_*cek 20
我用F#编译器做了几个实验,这里有一些我的观察.如果要创建IL文字,则需要将标记为值的值Literal放在模块内.例如这样:
module Constants =
[<Literal>]
let Num = 1
Run Code Online (Sandbox Code Playgroud)
作为旁注,我快速搜索了F#规范,看起来文字对于模式匹配非常有用,因为你可以将它们用作模式(只要它们以大写字母开头):
open Constants
match 1 with
| Num -> "1"
| _ -> "other"
Run Code Online (Sandbox Code Playgroud)
现在,问题是,Literal当你将它放在一个类型声明中时,为什么不像你期望的那样表现.我认为原因是letF#类型声明中的声明不能公开,只能在类/类型中可见.我相信当你使用C#和F#内联文字值时,这也是在类型声明中完成的.但是由于文字不能公开,因此没有理由生成literalIL字段,因为没有人可以访问它.