是否可以使用成员约束来执行F#类型测试模式?
如:
let f x =
match x with
| :? (^T when ^T : (static member IsInfinity : ^T -> bool)) as z -> Some z
| _ -> None
或
let g x =
match x with
| (z : ^T when ^T : (static member IsInfinity : ^T -> bool)) -> Some z
| _ -> None
两者都没有。
答案 0 :(得分:5)
你不能这样做,正如Petr所说,静态解析的类型参数在编译时被解析。它们实际上是F#编译器的一个特性,而不是.NET特性,因此这种信息在运行时不可用。
如果您希望在运行时检查此内容,可以使用反射。
let hasIsInfinity (x : 'a) =
typeof<'a>.GetMethod("IsInfinity", [|typeof<'a>|])
|> Option.ofObj
|> Option.exists (fun mi -> mi.ReturnType = typeof<bool> && mi.IsStatic)
这将检查名为IsInfinity
的静态方法,其类型为sig:'a -> bool