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

zpr*_*oxy 19 .net f# const

在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字段,因为没有人可以访问它.


kvb*_*kvb 2

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