2012-02-20 5 views
3

record optionの値をF#からC#にnull値として返すことは可能ですか?私はF#アセンブリにいくつかのロジックをカプセル化し、 "C#に自然な"ファサードの背後にあるものを隠すことを望みます。このようになりますのC#に戻るにはC#からの呼び出し時にレコードのオプションをnullに戻す

type Data = { DataField1: int; DataField2: string } 

とコード:ここではいくつかの合成例です

type SomeFacade() = 
    let data = Some { DataField1 = 1; DataField2 = "hello" } 

    member x.GetData() = if Option.isSome data then Option.get data else null 

しかし、null値を使用することを許可されていません。

  • [<AllowNullLiteral>]属性を使用しようとする可能性がありますが、レコードタイプには使用できません。
  • Recordの代わりにClassを使用できますが、ほとんどの作業がF#部分内で行われるはずなので、F#内で作業する方がより複雑になります。そして、私はwithキーワードを使って別のレコード値をコピーしてレコード値を作成する非常に便利な方法が好きです。
  • F#アセンブリ内でレコードとしてDataを使用し、C#アセンブリに公開するときに何らかの中間クラスDataClassに変換することもできますが、扱いにくいです。

解決策はありますか? (私はF#コードの中でヌル値を使用するつもりはないが、C#コードにヌル値を返すことを望む)。レコードタイプの場合

+1

のですか? –

+0

Nothing ...しかし、私はちょうどC#プロジェクトだけを含む大きなソリューションでF#を使って遊んでいます.F#にはあまりにも限定された型をF#アセンブリの外に見せたくありません。彼らは見ることができますが、そうでない方が良いでしょう。私たちはまだF#を使用していませんので、私は同僚が "未知"のプログラミング言語であまりにも怖がって欲しくないようにしています:) –

+1

ああ、ステルスのアプローチ:) –

答えて

6

Operators.Unchecked.defaultof<Data> 

nullである(ただFSIを使用してテスト)

これはオプションタイプを返すと間違って何おそらく最も簡単な解決策

関連する問題