2009-10-25 5 views
3

Impossible de définir la surcharge de l'opérateur sur le type (?):F # opérateur de recherche dynamique surcharge

type Foo = 
    val s : string 
    new(s) = { s = s } 
    static member (?) (foo : Foo, name : string) = foo.s + name 

let foo = Foo("hello, ") 
let hw = foo? world 

// error FS0043: The member or object constructor 'op_Dynamic' 
// takes 2 argument(s) but is here given 1. The required signature 
// is 'static member Foo.(?) : foo:Foo * name:string -> string'. 

Tout fonctionne très bien si j'utilise autonome laisser contraignant pour la définition de l'opérateur:

let (?) (foo : Foo) (name : string) = foo.s + name 

let hw = foo? world 

Mais je dois spécifier l'opérateur op_Dynamic directement pour le type Foo. Quel est le problème avec le premier extrait de code?

En utilisant F# 1.9.7.4 @ Visual Studio 2010 Beta2

Répondre

4

Peut-être il y a un moyen plus facile (je vais regarder), mais cela fera dans un pincement:

type Foo =  
    val s : string  
    new(s) = { s = s }  
    static member (?)(foo : Foo, name : string) = 
     foo.s + name 

let inline (?) (o:^T) (prop:string) : ^U = 
    (^T : (static member (?) : ^T * string -> ^U)(o,prop)) 

let foo = Foo("hello, ") 
let hw = foo ? world 
printfn "%s" hw 
+2

manière plus facile?!? Oui, cela fonctionne, mais pourquoi je devrais mettre cette solution de contournement "inline (?)" Dans n'importe quelle classe avec un opérateur surchargé (?) Juste pour l'utiliser? Pourquoi je ne peux pas utiliser la surcharge d'opérateur définie directement? – ControlFlow

+1

Oui, il s'avère qu'il y a un bug dans l'analyseur F # et votre code original devrait fonctionner. Merci de l'avoir signalé! J'ai classé le bug. – Brian