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

在F#中,如何在没有主构造函数的类型中初始化静态字段?,f#,c#-to-f#,F#,C# To F#,我有一个F#类,它派生自具有多个构造函数的.net类。为了公开它们,我实现了一个没有主构造函数的类型。现在我想添加一个静态字段。如何初始化静态字段?考虑这一点: type MyType = inherit DotNetType [<DefaultValue>] static val mutable private myStatic : int new () = { inherit DotNetType() } new (someArg:string)

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

type MyType =
    inherit DotNetType
    [<DefaultValue>] static val mutable private myStatic : int
    new () = { inherit DotNetType() }
    new (someArg:string) = { inherit DotNetType(someArg) }
type MyType=
继承点类型
[]静态值可变私有myStatic:int
new()={inherit dotnetype()}
new(someArg:string)={inherit dotnetype(someArg)}
现在,我如何初始化“myStatic”字段,使其在使用该类型时只运行一次,而在从未使用该类型时完全不运行?本质上,我需要一个C#静态构造函数块的等价物。

参见第8.6.3节,类中的其他对象构造函数:

对于没有主构造函数的类,可能会产生副作用 在初始化对象的字段后由 使用
附加constr expr然后使用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
type MyType=
继承点类型
[]静态值可变私有myStatic:int
new()={inherit dotnetype()}然后MyType.myStatic printfn“%d”//prints 0
MyType()|>忽略
MyType.Peek |>printfn“%d”//prints 1

我和OP一样好奇,我不喜欢唯一被接受的答案。在我的例子中,我最后做的就是在
模块
元素中使用一个普通字段(通过
let
),而不是
类型
元素。

这能解决您的问题吗:?不,不会,因为我的类型没有主构造函数。一个“静态DO”给了我这个错误:“静态值定义只能在一个主构造函数中使用。考虑向类型定义添加参数,例如,类型X(ARX)=……”谢谢回答。但是,每次调用构造函数时,都会运行逻辑一次,每次初始化类型本身都不会运行一次。@kvb它在初始化后为每次调用构造函数运行代码,而主构造函数的
static do
语句在启动时运行,与对构造函数的任何调用无关。因此,两者都不会模拟在创建第一个实例之前运行的。
附加constr expr then stmt
表单至少允许一些控件接近。