2012-01-26 10 views
5

Tengo una clase base con argumentos genéricos explícitos en F #. Estoy tratando de verificar si el tipo dado que estoy usando implementa una interfaz específica. Pensé "Si el OB:? ISysAware luego" haría, pero la queja es siempre el mismo:Coerción en tiempo de ejecución de tipos genéricos en F #

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

FS0008 de error: Esta coerción tiempo de ejecución o ensayo de tipo de tipo 'A a ISysAware implica un tipo indeterminado sobre la base de la información antes de este punto del programa. Las pruebas de tipo de tiempo de ejecución no están permitidas en algunos tipos. Se necesitan anotaciones de tipo adicionales.

Preferiría no utilizar la reflexión aquí, obviamente. IsAssignableFrom haría el truco, a un alto costo.

¿Pensamientos?

Respuesta

12

Algunos tipos de F # son tipos de valores; añadiendo box asegura que tipo de prueba se lleva a cabo sólo en los tipos de referencia:

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

interesante, pero tengo 'a: no struct' y 'a: null como restricciones. – hammett

4

El motivo del error es el tipo de corrector ser confundido ya que no puede trabajar a cabo el tipo, la solución - similar a la almohadilla de es añadir una anotación tipo

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