2012-01-26 26 views
5

我有一个在F#中具有显式泛型参数的基类。我试图检查我使用的给定类型是否实现了特定的接口。我想:“如果OB:ISysAware然后”基于信息从类型此运行胁迫或型式试验“一到ISysAware涉及一个不确定的类型:会做,但抱怨总是相同的:F中泛型类型的运行时强制#

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

错误FS0008在此节目点之前。某些类型不允许运行时类型测试。需要进一步的类型注释。

显然,我不想在这里使用反射。 IsAssignableFrom会付出高昂的代价。

想法?

回答

12

一些F#类型是值类型;加入box确保型试验在仅引用类型执行:

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

有趣的,但我确实有'a:不是结构和'a:null作为约束。 – hammett 2012-01-26 23:30:48

4

的原因错误是被混淆类型检查器,因为它不能工作的类型,溶液 - 类似垫的是添加一个类型注释

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