2011-01-02 14 views
3

Ich versuche, eine Klasse und eine Methode darin zu erstellen. Für C# und VB geben die CodeDom-Anbieter eine preditable Ausgabe aus, der F # CodeDom-Anbieter gibt jedoch Folgendes aus. Ich frage mich warum.Verwirrende Implementierung von F # CodeDom

exception ReturnException8abef2fbb2404165b4b8690157bd3a49 of obj 
exception ReturnNoneException8abef2fbb2404165b4b8690157bd3a49 

type 
    // Hello 

    test = class 
     new() as this = 
      { 
      } 
     abstract my_method : unit -> unit 
     default this.my_method () = 
      () 
    end 

Ignorieren der Ausnahme stuff (Ich denke, der Anbieter ist immer noch ein bisschen Buggy), ich bin neugierig, warum ich solch eine seltsame Definition mit new() as this, einer abstrakten Methode und einer Default-Implementierung. Fehle ich hier etwas?

+0

Nicht meine Schuld, dass viele Fragen, die ich stelle, keine nützlichen Antworten bekommen :) –

Antwort

4

Der vom CodeDOM-Generator generierte Code ist seltsam, aber es ist meist gültiger F # -Code, der kompiliert wird. Wie kvb angibt, ist die Definition von Konstruktor gültig. Es wäre schöner, wenn der CodeDOM-Anbieter Code mit impliziter Syntax generiert, aber das würde nicht gut funktionieren, wenn Sie mehrere Konstruktoren hätten.

Für die Ausnahmen werden diese verwendet, um Imperativ return Konstrukt zu emulieren (wie in C#). Zum Beispiel können Sie nicht direkt die folgende in F # schreiben:

for(int i = 0; i < 10; i++) 
    if (i == 5) return; 

So ist der CodeDOM-Generator verwendet Ausnahme return zu emulieren und try .. with es zu handhaben.

Der übliche Codierungsstil in F # unterscheidet sich einfach von C#/VB und die CodeDOM-Datenstrukturen wurden hauptsächlich für C#/VB entworfen. Wenn Sie guten F # -Code generieren möchten, ist es vielleicht besser, einen eigenen Code-Generator zu schreiben. Alternativ dazu könnte jemand einen F # CodeDOM-Provider erstellen, der nicht alle Funktionen unterstützt, aber netten Code generiert.

+0

Ich erinnere mich an ein Interview mit jemandem von Microsofts Sprachteam (ich habe vergessen wer). Als er nach CodeDOM gefragt wurde, sagte er etwas wie "CodeDOM kann * jede * Programmiersprache darstellen, solange diese Programmiersprache C# ist. Oder VB.NET natürlich, aber sie sind sowieso die gleiche Sprache." Über Expression Trees, F # -Angebote oder eine benutzerdefinierte AST zu gehen und einen benutzerdefinierten Code-Generator zu schreiben, ist wahrscheinlich der Weg zu gehen. –

+0

Aber in Bezug auf die abstrakte Methode - brauchen wir es wirklich? Ich meine, um eine Methode zu haben, kann ich nicht einfach 'member this.MyMethod =' oder etwas in diesem Sinne? –

+0

@Dmitri: Ich bin mir nicht sicher, ob ich mich erinnere, wie abstrakte Methoden genau in CodeDOM funktionieren. Wie auch immer, wenn es kompiliert werden soll, dann muss die Methode abstrakt sein (mit Standardimplementierung), weil Ihre Struktur eine andere Klasse enthalten kann, die sie überschreibt (was nicht nur mit 'member x.MyMethod ..' funktionieren würde) - und es würde in C# so funktionieren. Ich bin mir nicht sicher, ob es eine Möglichkeit gibt, anzugeben, dass diese Methode in CodeDOM nicht virtuell ist. –

3

Das sieht gut aus für mich.

new() as this = {} 

ist nur ein leeres Standardkonstruktors und die abstrakte Methode mit Standardimplementierung ist, wie Sie eine virtuelle Methode in F # definieren (siehe section 8.14.2 of the spec).