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

.net 如何在F#中定义类型成员常量?,.net,f#,constants,.net,F#,Constants,在C#中,可以定义如下类型成员常量: class Foo { public const int Bar = 600; } module Constants = [<Literal>] let Num = 1 IL看起来像这样 .field public static literal int32 Bar = int32(600) 如何在Visual F#/FSharp中执行相同的操作 我试过了,但没有用: [<Sealed>] type Foo() =

在C#中,可以定义如下类型成员常量:

class Foo { public const int Bar = 600; }
module Constants = 
  [<Literal>]
  let Num = 1
IL看起来像这样

.field public static literal int32 Bar = int32(600)
如何在Visual F#/FSharp中执行相同的操作

我试过了,但没有用:

[<Sealed>]
 type Foo() =

    [<Literal>]
    let Bar = 600
[]
Foo()类型=
[]
设Bar=600

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

我用F#编译器做了几个实验,下面是我的一些观察结果。如果要创建IL文本,则需要将标记为
文本的值放置在模块内。例如:

class Foo { public const int Bar = 600; }
module Constants = 
  [<Literal>]
  let Num = 1

现在的问题是,当您将
Literal
放在类型声明中时,为什么它的行为不符合预期。我认为原因是F#type声明中的
let
声明不能是公共的,只能在类/类型中可见。我相信当您使用C#和F#内联文字值时,它们都是内联文字值,这也是在类型声明中完成的。但是,由于文本不能是公共的,因此没有理由生成
literal
IL字段,因为没有人能够访问它。

我相信您可以使用
val
声明和使用
new()
编写的构造函数中的显式初始化来创建公共不可变字段,但这对常量不起作用,因为
val
字段是在构造函数中初始化的。@Tomas-我想你会发现你的建议实际上是定义了一个属性,而不是一个字段。但是,使用
val mutable
确实会产生一个可变字段。您是对的。public
val
会产生一个带有私有字段的属性(其动机是禁止类的可能C#用户修改应该是不可变的字段)。我问了这个问题----Chris Smith指出这是不可能的。在C#中,文本将内联到字节码中,但是const字段仍然可以用于其他类型。是-如果文本是公共的(例如在模块中),并且可以由某人使用,则在F#中会生成
字段
;如果它只在类内部可见,那么就没有必要生成字节码,因为其他类型无论如何都不能使用它。