在F#中,如何在没有主构造函数的类型中初始化静态字段?

Bru*_*zza 9 f# c#-to-f#

我有一个F#类,派生自一个带有多个构造函数的.net类.为了公开它们,我实现了一个没有主构造函数的类型.现在我想添加一个静态字段.如何初始化静态字段?考虑一下:

type MyType =
    inherit DotNetType
    [<DefaultValue>] static val mutable private myStatic : int
    new () = { inherit DotNetType() }
    new (someArg:string) = { inherit DotNetType(someArg) }
Run Code Online (Sandbox Code Playgroud)

现在,如何在使用类型的情况下以一次运行的方式初始化"myStatic"字段,如果从未使用该类型,则根本不运行?本质上,我需要等效的C#静态构造函数块.

kae*_*fer 5

请参阅F# 规范的8.6.3“类中的其他对象构造函数”

对于没有主构造函数的类,可以在对象的字段初始化后使用additional-constr-expr then stmt表单来执行副作用。

例子:

type MyType  =
    inherit DotNetType
    [<DefaultValue>] static val mutable private myStatic : int
    new () = { inherit DotNetType() } then MyType.myStatic <- 1
    new (someArg:string) = { inherit DotNetType(someArg) }
    static member Peek = MyType.myStatic

MyType.Peek |> printfn "%d" // prints 0
MyType() |> ignore
MyType.Peek |> printfn "%d" // prints 1
Run Code Online (Sandbox Code Playgroud)