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!
Haben Sie versucht Typ-Annotation mit erwarteten Typ wie die Fehlermeldung sagt Ihnen? –
@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