使用 C 中的選項型別
將 Option 型別公開給 C#程式碼並不是一個好主意,因為 C#沒有辦法處理它們。選項要麼是在你的 C#專案中引入 FSharp.Core
作為依賴項(如果你正在使用不是為 C#互操作而設計的 F#庫,則必須執行此操作),或者將 None
值更改為 null
。
前 F#4.0
這樣做的方法是建立自己的轉換函式:
let OptionToObject opt =
match opt with
| Some x -> x
| None -> null
對於價值型別,你必須訴諸拳擊或使用 System.Nullable
。
let OptionToNullable x =
match x with
| Some i -> System.Nullable i
| None -> System.Nullable ()
F#4.0
在 F#4.0 中,函式 ofObj
,toObj
,ofNullable
和 toNullable
引入了 Option
模組。在 F#interactive 中,可以按如下方式使用它們:
let l1 = [ Some 1 ; None ; Some 2]
let l2 = l1 |> List.map Option.toNullable;;
// val l1 : int option list = [Some 1; null; Some 2]
// val l2 : System.Nullable<int> list = [1; null; 2]
let l3 = l2 |> List.map Option.ofNullable;;
// val l3 : int option list = [Some 1; null; Some 2]
// Equality
l1 = l2 // fails to compile: different types
l1 = l3 // true
請注意,None
在內部編譯為 null
。然而就 F#而言,它是一個傳播 12。
let lA = [Some "a"; None; Some "b"]
let lB = lA |> List.map Option.toObj
// val lA : string option list = [Some "a"; null; Some "b"]
// val lB : string list = ["a"; null; "b"]
let lC = lB |> List.map Option.ofObj
// val lC : string option list = [Some "a"; null; Some "b"]
// Equality
lA = lB // fails to compile: different types
lA = lC // true