2017-07-12 5 views
2

は、私は私がNULL可能メンバーnull可能な識別された共用体を宣言する方法は?

type test(value) = 
member this.Value : Nullable<foo> = value 

私は私は、ことをやろうとして、このDSをdelcareしようとしている別の型を持っているこの

type foo = 
| Yes of bool 
| Number of decimal 

のような判別組合を持っていますfoo 『というパブリックデフォルトコンストラクタを持っている。私はこの問題を解決するにはどうすればよい?.NETのNullable<T>タイプは本当に値型で使用するように設計されて

+3

nullableで、オプションではないのはなぜですか? nullableはここの要件ですか? – DaveShaw

答えて

7

などintや「ジェネリック構築物がタイプすることを必要とする』取得stringなどの参照型では使用できません。

識別された共用体は、実際にクラスにコンパイルされるため、デフォルトで参照型です。しかし、それらは値型にする構造体でなければなりません。しかし、あなたがそうすると、別のエラー:If a union type has more than one case and is a struct, then all fields within the union type must be given unique namesが発生します。あなたは、この例のように、各ケース内の値に名前を付けることができます。

[<Struct>] 
type foo = 
| Yes of yes:bool 
| Number of number:decimal 

今、あなたはNullable<foo>を持つことができます。しかし、おそらく実際にこれをやりたいとは思わないでしょう。参照型と値型の両方に対して "nullable"値を表すためのF#の通常の方法は、Option型を使用することです。代わりにfoo構造体を作るので、あなたはおそらく代わりにOption<foo>にタイプを変更する必要があります。

type test(value) = 
    member this.Value : Option<foo> = value 

test(Some (Number 1M)) // some value 
test(None) // no value 

F#が大きくそれが不可能F#で定義された型がnullにできるようになり、あなたが代わりにすべてのためにOptionを使用します参照型と値型を区別します。 Nullableは、それを使用する既存の.NETコードで作業する場合にのみ便利です。

関連する問題