2015-08-03 4 views
2

setter is a getterPourquoi cet accès aux membres de type statique pense-t-il que c'est un getter?

rvm est un objet, pas une fonction.

Pourquoi la contrainte (^b:(member ReportSubTitle:(String -> unit)) rvm) apparaît-elle en tant que getter au lieu d'un setter? Est-ce un problème Tooltip ou autre chose?

Partout ailleurs où j'ai utilisé des génériques statiquement typés, je trouve que je n'ai même pas à dire le type du tout. Cela ne fonctionne pas non plus:

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

Moved cette tentative en fonction et a essayé ce que @kvb a suggéré

no parens

Ceci est la seule utilisation que ce soit de rvm dans la portée/méthode englobante

+0

Essayez sans les parens autour de type du membre: 'ReportSubTitle: String-> unit'. Ceci différencie une méthode d'une propriété fonction-évaluée. – kvb

+0

l'a essayé, "Expected 2 expressions, got 1" – Maslow

+0

Vous devez fournir à la fois 'rvm' et' test' en tant qu'arguments en même temps (comme un tuple syntaxique). – kvb

Répondre

2

Je ne suis pas entièrement sûr de la manière correcte d'appeler des setters via des contraintes de membres statiques. Je trouve toujours la fonctionnalité un peu approximative et préfère utiliser d'autres options lorsque cela est possible (c'est-à-dire, définir une interface et accéder aux membres via l'interface).

Cela dit, il semble que vous pouvez utiliser set_PropertyName dans la contrainte. Le petit exemple suivant fonctionne très bien pour moi:

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