2011-01-02 13 views
3

私はクラスとその中にメソッドを作成しようとしています。 C#とVBの場合、CodeDomプロバイダは出力可能ですが、F#CodeDomプロバイダは次のように出力します。なぜ私は思っています。例外のものを無視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 

(私はプロバイダがまだ少しバギーだと思います)、私は、このようなnew() as thisとの奇妙な定義、抽象メソッドおよびデフォルトの実装を取得する理由として興味があります。私はここに何かを逃していますか

+0

私が尋ねる多くの質問が役に立つ回答を得られないという私のせいではありません:) –

答えて

4

CodeDOMジェネレータによって生成されたコードは奇妙ですが、コンパイルするのは主に有効なF#コードです。 kvbが指摘するように、コンストラクタの定義は有効です。 CodeDOMプロバイダが暗黙的な構文を使用してコードを生成した場合はより良いでしょうが、コンストラクタが複数ある場合はうまく機能しません。

例外は、命令語return(C#のように)をエミュレートするために使用されます。たとえば、あなたが直接、F#で次のように記述することはできません。

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

そうたCodeDOMジェネレータは、それを処理するためにreturntry .. withをエミュレートするために例外を使用しています。

F#の通常のコーディングスタイルは、C#/ VBとは少し異なり、CodeDOMデータ構造は主にC#/ VB用に設計されています。素敵なF#コードを生成したい場合は、独自のコードジェネレータを記述することをお勧めします。あるいは、誰かがすべての機能をサポートしていないF#CodeDOMプロバイダを作成することもできますが、素敵なコードが生成されます。

+0

私はマイクロソフトの言語チームの誰かとのインタビューを覚えています。彼はCodeDOMについて尋ねられたときに、 "CodeDOMは*どんな*プログラミング言語でも、そのプログラミング言語がC#またはVB.NETである限り、どんな表現でも構いませんが、とにかく同じ言語です。エクスプレッションツリー、F#の見積もりやカスタムASTを使ってカスタムコードジェネレータを書くことはおそらく道のりです。 –

+0

しかし、抽象的な方法に関して - 私たちは本当にそれを必要としますか?私は、メソッドを持つことができないことを意味します私は 'メンバーthis.MyMethod ='または何かその効果? –

+0

@Dmitri:抽象メソッドがCodeDOMでどのように正確に機能するかを覚えているかどうかはわかりません。とにかく、もしそれがコンパイルされるとすれば、あなたのツリーはそれを上書きする別のクラスを含むかもしれないので、メソッドは抽象クラスでなければなりません( 'member x.MyMethod ..'だけではうまくいかないでしょう)。 C#でこのように動作します。 CodeDOMで非仮想メソッドを指定する方法があるかどうかはわかりません。 –

3

これは私にとってうまく見えます。

​​

はちょうど空のデフォルトコンストラクタで、デフォルトの実装を持つ抽象メソッドを使用すると、F#(section 8.14.2 of the specを参照)での仮想メソッドを定義する方法です。

関連する問題