2012-01-15 11 views
1

は考える:F#でコンパイル時型のキャスト演算子を定義する方法は?

let ab = ArgumentBlockSettingStore() 
let a = ab :> ISettingStore 

よう

let ab, a = ~~ArgumentBlockSettingStore() : _ * ISettingStore 

が可能となる(~~)プレフィックス演算子を定義する方法はありますか?

+0

私はいくつかのコンパイラの制限事項に記載されているように見えます: http://stackoverflow.com/questions/4561663/rewrite-some-c-sharp-generic-code-into-f –

答えて

2

私は、あなたがコメントで言及したコンパイラの制限にぶつかっていると思います。~~演算子は完全に汎用的で安全な方法で書くことができません。つまり、引数が実装するインターフェイスにのみキャストできます。あなたはどの他の型にキャストします演算子を定義することができますが、それはあまり安全です:

let inline (~~) (a:^T) : ^T * ^R = a, (box a) :?> ^R 

let reader, (disposable:IDisposable) = ~~(new StreamReader("...")) 

は私が inlineを使用し、オペレータは非常に簡単ですので、それは通常の事業者と同じように動作します。 disposableの型名に Randomを使用してもコンパイルされますが、少し不幸です。

+0

タイプセーフではないにもかかわらずそれを行う方法。ありがとう:)私は1つの場所でのみそのようなキャスティングが必要なので私はそれを使用しないと思うが、私はそれが実装する可能性のある様々なインターフェイスすべてで使用するオブジェクトを宣言するきちんとした方法だと思う。また、1つのタイプ、2つのインターフェースなどのために~~~に拡張することもできます。 –

関連する問題