是否可以在 F# 中定义公共静态只读字段?

Pav*_*nin 4 f#

这个问题很相似,但我没有看到令我满意的答案。

那么,等效项public static readonly string Name = ...;在 F# 中看起来如何?

我可以定义static member Name = ...,但这会创建静态只读属性。

Tom*_*cek 5

我认为没有办法在 F# 中获取公共静态只读字段。

如果您使用static let,您最终会得到一个私有字段(事实上,我认为这实际上被编译为具有私有静态属性的私有字段Xyz):

type B() = 
  static let Xyz = 1
Run Code Online (Sandbox Code Playgroud)

您可以使用 定义实际字段val,但这不支持初始化(因此您需要在静态构造函数中设置它)并且编译器要求此类字段是私有的:

type A() = 
  static do A.Xyz <- 1
  [<DefaultValue>] 
  static val mutable private Xyz : int 
Run Code Online (Sandbox Code Playgroud)

如果您尝试创建该字段public,您将得到:

错误 FS0881:类型中的静态“val”字段必须是可变的、私有的并用“[]”属性标记。它们被初始化为其类型的“空”或“零”值。还可以考虑在类类型中使用“static let mutable”绑定。

我认为错误消息可以回答您的问题。也就是说,我想不出为什么需要静态公共字段的充分理由 -let模块中的绑定通常应该涵盖静态公共字段可能拥有的用例(除非您需要这个,因为某些库会寻找静态通过反射的公共领域...)。