使用F#,我有以下(简化),工作正常:

type MyInt =
    struct 
        val Value: int
        new v = { Value = v }
    end
    static member inline name() = "my_int"   // relevant line

let inline getName (tp: ^a): string = (^a: (static member name : unit -> string) ())

在我看来,显式成员约束中的静态解析成员签名需要一个函数 . 我想知道它是否也可以用于字段 . 我试了几件事:

以下将编译,但不会工作,并将失败并出现错误

错误FS0001:类型'MyInt'不支持运算符'get_name'

type MyInt =
    //...
    static member inline name = "my_int"

let inline getName (tp: ^a): string = (^a: (static member name : string) ())

删除 () 以防止它尝试调用gettor是语法错误 . 如果我将其更改为实际实现gettor,它可以工作(但这与原始代码基本相同) .

type MyInt =
    // ...
    static member inline name with get() = "my_int"

let inline getName (tp: ^a): string = (^a: (static member name : string) ())

有没有办法使用显式成员约束或类似方法获取编译器来查找静态字段?或者这只是限制语法的限制?


更新:

令人惊讶的是,它确实适用于实例字段,或者在本例中,结构字段:使用 (^a: (member Value: 'b) ()) ,它将调用成员 Value .