如何在F#中定义类型成员常量?

时间:2010-03-08 07:46:40

标签: .net f# const

在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

2 个答案:

答案 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)

我不确定这是可能的。实际上,我甚至认为你不能创建不可变的公共字段,更不用说常量了。