F# 为什么这个静态类型的成员访问认为它是一个getter?

F# 为什么这个静态类型的成员访问认为它是一个getter?,f#,duck-typing,structural-typing,F#,Duck Typing,Structural Typing,rvm是一个对象,而不是一个函数 为什么约束(^b:(member ReportSubTitle:(String->unit))rvm)作为getter而不是setter出现?这是工具提示问题还是其他问题 在我使用静态类型泛型的其他地方,我发现我甚至不必告诉它类型。这也不起作用: // Setup the sub title with the total let subTitleSetter = (^b:(member ReportSubTitle:_) rvm ) subTitleSette

rvm
是一个对象,而不是一个函数

为什么约束
(^b:(member ReportSubTitle:(String->unit))rvm)
作为getter而不是setter出现?这是工具提示问题还是其他问题

在我使用静态类型泛型的其他地方,我发现我甚至不必告诉它类型。这也不起作用:

// Setup the sub title with the total
let subTitleSetter = (^b:(member ReportSubTitle:_) rvm ) 
subTitleSetter ("Total: " + total.ToString("C") )
将此尝试移动到函数中,并尝试@kvb建议的内容


这是
rvm
在封闭范围/方法中的唯一用途

我不完全确定通过静态成员约束调用setter的正确方法是什么。我总是觉得功能的边缘有点粗糙,如果可能的话,我更喜欢使用其他选项(即定义接口并通过接口访问成员)

也就是说,看起来可以在约束中使用
set\u PropertyName
。下面的小例子对我来说很好:

type A() = 
  member val Foo = 0 with get, set

let a = A()
let setter v = (^b:(member set_Foo : int -> unit) (a, v) )

setter 42
a.Foo

尝试不使用成员类型的括号:
ReportSubTitle:String->unit
。这将方法与函数值属性区分开来。尝试过它,“期望2个表达式,得到1”您必须同时提供
rvm
test
作为参数(作为语法元组)。