2017-12-20 4 views
3

Iは、一般的なパラメータを受け取り、抽象メソッド渡し「単位」

type MyInterface<'a> = 
    abstract member abstractMethod: 'a -> 'a 

を有するインタフェースを持っている...と私は、基本クラスから継承する派生クラスを有しますtypeパラメータ

type Derived() = 
    interface MyInterface<unit> with 
     override this.abstractMethod (_) =() 

ためユニットを使用しますが、コンパイラはそれが

Error The member 'abstractMethod : unit -> unit' does not have the correct type to override the corresponding abstract method.

を不平を言います0

ユニットの代わりに別のタイプを使用すると、たとえばのコードがコンパイルされます。

これはコンパイラのバグですか?それを回避する方法はありますか?

ありがとうございます!

+1

abstractMethod' 'のあなたのオーバーライドが署名'ユニットを持っていません - > unit' - 指定されていない型( '_')の引数をとります。 –

+1

https://stackoverflow.com/questions/40283165/under-what-c​​onditions-is-unit-a-typeとそこからリンクされているその他の質問を参照してください。 – kvb

答えて

3

unitは、相互運用の面で「特別」である:関数パラメータとしてunitをとる場合には、パラメータのない関数としてILにコンパイルされ、関数は結果としてunitを返すとき、それはvoid関数としてコンパイルされ。このトリッキーの結果として、実際にunitを相互運用設定(クラスやインターフェイスなど)の「汎用」タイプとして使用することはできません。私は私のマシン上でコードをコンパイルしようとすると、

は実際には、私は別のエラーが表示されます。私は、上記の大体何言おうとしている

The member 'abstractMethod : unit -> unit' is specialized with 'unit' 
but 'unit' can't be used as return type of an abstract method 
parameterized on return type. 

(あなたが取得しているものを取得している理由は、私はわからないんだけど、おそらくあなたは、F#の古いバージョンを使っている)