2017-02-03 1 views
4

Ich habe einen Typ Provider, der mir den Fehler "Typenkonflikt beim Spleißen von Ausdruck in Zitatliteral" gibt.Wie ruft man eine Funktion aus dem Zitat eines Aufrufs in Type Provider?

Ich extrahierte den folgenden Code, um das Problem in einem kleineren Kontext zu reproduzieren.

let f (s : string) : string = s //some dummy implementation 

let t = ProvidedTypeDefinition(asm, ns, "Root", Some typeof<obj>) 
let ctor = ProvidedConstructor(parameters = [], 
           InvokeCode = (fun args -> <@@ "root" :> obj @@>)) :> MemberInfo 

let prop = ProvidedProperty(propertyName = "SomeProperty", 
          parameters = [], 
          propertyType = typeof<string>, 
          GetterCode = (fun args -> <@@ f %%(args.[0]) @@>)) :> MemberInfo 

do t.AddMembers [ctor; prop] 
    t.SetBaseType typeof<obj> 

... und wenn ich den Typ-Anbieter wie

let root = Provided.Root() 

let a = root.SomeProperty 

verwenden erhalte ich die Fehlermeldung:

Error: The type provider 'typeproviders.providerpoc+MyProvider' reported an error in the context of provided type 'typeproviders.providerpoc.Provided.Root', member 'get_Menu'.

The error: Type mismatch when splicing expression into quotation literal.

The type of the expression tree being inserted doesn't match the type expected by the splicing operation.

Expected 'System.Object', but received type 'System.String'.

Consider type-annotating with the expected expression type, e.g., (%% x : string) or (%x : string).. Parameter name: receivedType.

Wie kann ich schreiben das Zitat der Lage sein, eine Funktion aufzurufen im Zitat?

Danke!

+1

Haben Sie versucht Typ-Annotation mit erwarteten Typ wie die Fehlermeldung sagt Ihnen? –

+0

@FyodorSoikin - die Nachricht ist ein wenig irreführend, weil der 'string' Teil nur ein Beispiel ist, das nicht mit der tatsächlichen Typabweichung zusammenhängt, und den Typ _expected_ darstellt, nicht den Typ _received_. Sie müssten also '%% (args. [0]: obj)' verwenden, aber das wird nichts selbst beheben, da 'f' eine Zeichenfolge erwartet. Tomas Antwort zeigt den richtigen Weg, dies zu beheben. – kvb

Antwort

6

Die Fehlermeldung besagt, dass Sie einen zitierten Ausdruck vom Typ obj an einer Stelle platzieren, an der ein in Anführungszeichen gesetzter Ausdruck vom Typ string erwartet wird.

Ich vermute, dies geschieht, wenn die GetterCode in der mitgelieferten Eigenschaft zu erstellen:

GetterCode = (fun args -> <@@ f %%(args.[0]) @@>) 

Hier args ist ein Array von zitierte Ausdrücke, wo jeder Ausdruck vom Typ obj, aber die Funktion f erwartet einen String und so das Zitat Füllen Sie das Loch %% Verwendung von Typ sein sollte string

eine Typumwandlung Hinzufügen, dass die obj in string verwandeln würde den Trick tun sollten:

GetterCode = (fun args -> <@@ f (unbox<string> (%%(args.[0]))) @@>) 
Verwandte Themen