2016-05-19 8 views
4

演算子を使用してタイプキャストの中にC#のようなコードをいくつか見たことがありますが、私は多くのオンラインで検索しましたが、それについて。F#:>演算子の使用方法

その演算子は何のために使用されていますか?

どのように動作しますか?

どこにドキュメントがありますか?

+0

オペレータがF#演算子を探すときに参照する:https://msdn.microsoft.com/sv-se/visualfsharpdocs/conceptual/symbol-and-operator-reference-[fsharp] – FuleSnabel

答えて

9

:>は、アップキャスト演算子です。これは階層構造の上にキャストするために使用されるため、コンパイル時に検証できるキャストのタイプです。

対応する:?>はダウンキャスト演算子ですが、この成功は実行時にのみ解決できます。

は、詳細については、このページを参照してください:https://msdn.microsoft.com/visualfsharpdocs/conceptual/casting-and-conversions-[fsharp]

+1

cu新しい "公式な" F#ドキュメントの記事の最新版を入手してください。https://msdn.microsoft.com/visualfsharpdocs/conceptual/casting-and-conversions-%5bfsharp%5d – TeaDrivenDev

+0

@TeaDrivenDevリンクを更新しました。ありがとうございました。あなたの答えを狙ってくれて申し訳ありません! – TheInnerLight

8

@TheInnerLightが説明するように、:>オペレータはアップキャストを表します。あなたがC#から来ているならば、これはC#(安全な)アップキャストと(安全でない)ダウンキャストの両方が(SomeType)valueと書かれているので、これに慣れるまで少し時間がかかります。

F#では、コンパイラがC#コンパイラのように自動アップキャストを最も一般的な場所に挿入するため、:>は頻繁には必要ありません。

foo (System.Random()) 
:引数は( foo期待する関数など) Randomいうより objであっても、

let foo (a:obj) = 0 

F#コンパイラは以下の罰金を受け入れ:たとえば、私たちはobjとるfooを持っていると言います

これを明示的に書くことはできますが、コンパイラがアップキャストを挿入するため、コンパイラがアップキャストを挿入するため、これを行う必要はありません。

foo (System.Random() :> obj) 

明示的アップキャストが必要な場合は、ifまたはmatch構成の異なる支店から異なる値を返す場合です。たとえば:

if true then obj() 
else System.Random() 

これはチェックして、あなたがエラーを取得する入力していません:

error FS0001: This expression was expected to have type System.Object but here has type System.Random

あなたが明示的にアップキャストでこれを修正することができます:私は後藤他の回答に加えて

if true then obj() 
else System.Random() :> obj