Ich habe eine in F# geschriebene Klasse, die ich in C# verwende und die eine Methode definiert Render
:
member this.Render template (context: IContext) =
let tokens = Lexer.tokenize template
let parser = new DefaultParser([for filter in _filters -> filter])
let resp = new StringBuilder()
for node in parser.Parse tokens None do
ignore <| resp.Append(node.render context)
resp.ToString()
The signature of this method is template:string -> (IContext -> string)
, which of course reads as "member Render
takes a string
parameter, then returns a function that takes an IContext
and produces a string.
Wenn ich die Deklaration von "Member" in eine Let-Bindung ändere und sie als lokale Funktion für die Klassendefinition definiere:
let Render template (context: IContext) =...
Dann wird die Signatur zu dem, was Sie erwarten würden - string -> IContext -> string
, was lautet " Render
nimmt eine Zeichenfolge, dann eine IContext
und erzeugt eine Zeichenfolge".
Gibt es eine Möglichkeit, ein Mitglied dazu zu bringen, sich wie die Let-Bindung zu verhalten? Dies verursacht Probleme bei der Verwendung dieses Members aus C#, da die Signatur zu wird Render(string, FastFunc<IContext, string>)
, was nicht übermäßig verwendbar ist.
Lösung des Problems
If you want to expose to C#, you should write it tupled style:
> type Foo =
- member this.Bar (param1, param2) = param1 + param2;;
type Foo =
class
member Bar: param1:int * param2:int -> int
end
Dadurch wird eine normale Methode im.NET-Stil verfügbar gemacht.
Keine Kommentare:
Kommentar veröffentlichen