Почему этот статически типизированный доступ к члену думает, что это геттер?

сеттер является геттером

rvm — это объект, а не функция.

Почему ограничение (^b:(member ReportSubTitle:(String -> unit)) rvm ) появляется как геттер, а не сеттер? Это проблема всплывающей подсказки или что-то еще?

Везде, где я использовал статически типизированные дженерики, я обнаружил, что мне даже не нужно указывать тип. Это тоже не работает:

// Setup the sub title with the total
let subTitleSetter = (^b:(member ReportSubTitle:_) rvm ) 
subTitleSetter ("Total: " + total.ToString("C") )

Переместил эту попытку в функцию и попробовал то, что предложил @kvb

без скобок

Это единственное использование rvm во внешней области/методе.


person Maslow    schedule 03.08.2015    source источник
comment
Попробуйте без скобок вокруг типа члена: ReportSubTitle:String->unit. Это отличает метод от свойства с функциональным значением.   -  person kvb    schedule 03.08.2015
comment
попробовал, ожидал 2 выражения, получил 1   -  person Maslow    schedule 03.08.2015
comment
Вы должны указать как rvm, так и test в качестве аргументов одновременно (как синтаксический кортеж).   -  person kvb    schedule 03.08.2015


Ответы (1)


Я не совсем уверен, как правильно вызывать сеттеры через статические ограничения членов. Я всегда нахожу эту функцию немного грубой по краям и предпочитаю использовать другие параметры, когда это возможно (например, определить интерфейс и получить доступ к членам через интерфейс).

Тем не менее, похоже, что вы можете использовать set_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
person Tomas Petricek    schedule 03.08.2015