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