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

如何在F#中同时强制转换和检查NULL?,f#,F#,在C#中,可以使用将引用类型值强制转换为请求的类型或null,因此只需要在使用之前检查强制转换值是否为null。如何在F#中实现它?您可以使用模式匹配和:?作为模式。F#不喜欢null值,因此如果该值的类型不正确(或者之前为null),它不会自动为您提供null。您可以在第二个分支中处理null和其他类型的值: let o = box (System.Random()) match o with | :? System.Random as rnd -> rnd.Next() | _ -&g

在C#中,可以使用将引用类型值强制转换为请求的类型或null,因此只需要在使用之前检查强制转换值是否为null。如何在F#中实现它?

您可以使用模式匹配和
:?作为
模式。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

让castAs t | u->Unchecked.defaultof您可以使用模式匹配和
:?作为
模式。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

让castAs t |─->未选中。如果我确定我正在处理引用类型,则是否需要装箱?不,不需要装箱。我加入它只是为了让示例变得有趣(从
System.Random
转换到
System.Random
将始终有效,编译器会告诉您:-)如果我确定我正在处理引用类型,是否需要装箱?不,装箱不是必需的。我加入它只是为了让示例变得有趣(从
System.Random
转换到
System.Random
总是有效的,编译器会告诉您:-))