2

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

4

1 回答 1

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
于 2013-09-28T02:24:33.950 回答