使用 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 中,函数 ofObjtoObjofNullabletoNullable 引入了 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