2016-09-11 1 views
4

Pourquoi ce travail:Ajout d'une méthode d'extension à un enregistrement avec l'unité de mesure

type Money = 
    { Amount : decimal } with 

    member inline m.gotMoney : bool = 
     m.Amount > 0M 

mais cela ne

type MoneyUOM<[<Measure>]'currency> = 
    { Amount : decimal<'currency> } with 

    member inline m.gotMoney : bool = 
     m.Amount > 0M<_> 

Au lieu de cela, je me error FS0339: The signature and implementation are not compatible because the type parameter in the class/signature has a different compile-time requirement to the one in the member/implementation

+2

Malheureusement, c'est parce que vous utilisez 'decimal' au lieu de' float'. Le problème est que "0M <_>" n'est pas considéré comme une valeur générique, alors que "0.0 <_>" l'est. – kvb

+0

@kvb Cela répond au "pourquoi?" partie de la question, d'une manière. Veuillez le convertir en une réponse afin que vous puissiez obtenir un vote bien mérité. – GregC

Répondre

4

DecimalWithMeasure est utile ici. Par exemple, cela fonctionne pour moi:

type MoneyUOM<[<Measure>]'currency> = 
    { Amount : decimal<'currency> } with 

    member m.gotMoney() : bool = 
     let zero = LanguagePrimitives.DecimalWithMeasure<'currency> 0M 
     m.Amount > zero