2012-01-26 28 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