如何在F#中同时转换和检查NULL?

时间:2013-09-28 02:20:36

标签: f#

在C#中,可以使用as将引用类型值转换为请求的类型或null,这样只需要在使用之前检查转换值是否为null。我怎么在F#中做到这一点?

1 个答案:

答案 0 :(得分:4)

您可以使用模式匹配和:? <type> as <value>模式。 F#不喜欢null值,因此如果值不是正确类型(或之前为null),它不会自动为您提供null。您可以在第二个分支中处理null和其他类型的值:

let o = box (System.Random())
match o with
| :? System.Random as rnd -> rnd.Next()
| _ -> -1

如果您真的想获得null值,可以使用Unchecked.defaultof,但这可能不是一个好主意,可能会导致错误:

let castAs<'T> (o:obj) = 
  match o with :? 'T as t -> t | _ -> Unchecked.defaultof<'T>

castAs<System.Random> null                     // = null
castAs<System.Random> "hi"                     // = null
castAs<System.Random> (box (System.Random()))  // = random