F#オプションタイプのいくつかのプロパティは、C#プロジェクトからは見えません。タイプを調べることによって、私は多かれ少なかれ理由を見ることができますが、正確に何が起こっているのか、なぜこれらの選択がなされたのか、問題を回避する最良の方法を本当に理解していません。FSharpOptionの一部のプロパティ(IsSomeやIsNoneなど)がC#から見えないのはなぜですか?
問題を示す抜粋です。私は2つのプロジェクト、C#プロジェクトとF#プロジェクトを含むVS2015ソリューションを持っています。
type Foo() =
member this.Bar() = Some(1)
さらに、F#で、私はこのような何か書くことができます::だから、オプションタイプが名前付きプロパティを持っているように思われる
let option = (new Foo()).Bar()
let result = if option.IsNone then "Is none" else "Is some"
をF#プロジェクトでは、私は次のように定義されたクラスを持っていますIsNone
。さて、C#プロジェクトでは、F#プロジェクトからコンパイルされた.dllへの参照があります。これにより私は例えば
var optionType = new Foo().Bar();
変数optionType
はFSharpOption<int>
です。上記のように、F#プロジェクトでオプションタイプを使用すると、通常、たとえばIsSome
とIsNone
のプロパティにアクセスできます。しかし、optionType.IsNone
のようなものを書き込もうとすると、「プロパティ、インデクサーまたはイベント...が言語でサポートされていません」というCS1546エラーが表示されます。これに一致して、IntelliSenseがプロパティを検出しません:
FSharpOptionタイプを検査する際に今、私はIsNoneとIsSome「プロパティ」は、静的メソッド表示されていることがわかります。
Iは、F#1からタイプを検査する場合、私の代わりに、以下参照:
ここでは、プロパティIsSome
とIsNone
の「存在」が明白です。 VS2015は、これらのプロパティ上にカーソルを置くと、次のような注釈が表示されます。「包含するタイプでは、ヌル・ユニオンの大文字小文字の表現値として 'null'を使用できます。このメンバーは静的メンバーとしてコンパイルされます。これは、静的メソッド(lukegvとFyodor Soikinに記載されているように)以外のプロパティが利用できない理由です。
したがって、状況は次のようになります。コンパイルされたFSharpOption型には、IsNoneおよびIsSomeプロパティがありません。これらのプロパティをエミュレートする機能を有効にするために、F#のシーンの背後に何かが起こっています。
私はMicrosoft.FSharp.CoreのOptionModule
を使用してこの問題を回避できることを知っています。しかし、この機能は、F#コアライブラリの設計者が意識して選択したようです。選択の理由は何ですか? OptionModule
を適切な方法で使用しているか、C#のFSharpOption<T>
タイプを使用するより良い方法がありますか?
ありがとうございます。なぜなら、None値が本当にnullであるという事実は、IsNoneとIsSomeのプロパティが削除された理由の良い説明です。私は、コンパイルされたクラスでは、 "プロパティ"は静的であることをあなたとlukegvの発言を含めるために少し質問を編集しました。 –
Sooo ...まだメカニックと理由がないのですか?それ以外は不明ですか? –
いいえ、意味があります、ありがとう:-) –