.net F中泛型类型的运行时强制#

.net F中泛型类型的运行时强制#,.net,f#,.net,F#,我有一个基类,在F#中有显式的泛型参数。我试图检查我使用的给定类型是否实现了特定接口。我以为“如果ob:?ISysAware then”就可以了,但抱怨总是一样的: let (|SysAware|_|) t = match t with | :? ISysAware as p -> Some(p) | _ -> None 错误FS0008:从类型“a”到ISysAware的此运行时强制或类型测试涉及基于此程序点之前的信息的不确定类型。某些类型上不允许进行运

我有一个基类,在F#中有显式的泛型参数。我试图检查我使用的给定类型是否实现了特定接口。我以为“如果ob:?ISysAware then”就可以了,但抱怨总是一样的:

let (|SysAware|_|) t = 
    match t with
    | :? ISysAware as p -> Some(p)
    | _ -> None
错误FS0008:从类型“a”到ISysAware的此运行时强制或类型测试涉及基于此程序点之前的信息的不确定类型。某些类型上不允许进行运行时类型测试。需要进一步的类型注释

显然,我不想在这里使用反射。IsAssignableFrom将以高昂的成本完成这一任务

思想?

有些F#类型是价值类型;添加
可确保仅对参考类型执行型式试验:

let (|SysAware|_|) t = 
    match box t with
    | :? ISysAware as p -> Some(p)
    | _ -> None

错误的原因是类型检查器被混淆,因为它无法计算出类型,解决方案-类似于pad的是添加类型注释

let (|SysAware|_|) (t:obj) = 
    match t with
    | :? ISysAware as p -> Some(p)
    | _ -> None

有趣,但我确实有'a:not struct'和'a:null作为约束。