2012-01-26 28 views
5

Tôi có một lớp cơ sở với các đối số chung rõ ràng trong F #. Tôi đang cố gắng để kiểm tra xem loại được cho tôi đang sử dụng thực hiện một giao diện cụ thể. Tôi nghĩ "nếu ob: ISysAware sau đó" sẽ làm gì, nhưng phàn nàn luôn là như nhau:Thời gian ép buộc của các kiểu chung trong F #

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

lỗi FS0008: Đây ép buộc thời gian chạy hoặc gõ thử từ loại 'vào ISysAware liên quan đến một loại không xác định dựa trên thông tin trước điểm chương trình này. Thử nghiệm loại thời gian chạy không được phép trên một số loại. Cần thêm chú thích loại.

Tôi không muốn sử dụng sự phản chiếu ở đây, hiển nhiên. IsAssignableFrom sẽ thực hiện thủ thuật với chi phí cao.

Suy nghĩ?

Trả lời

12

Một số loại F # là các loại giá trị; thêm box đảm bảo rằng loại thử nghiệm được thực hiện trên chỉ các loại tài liệu tham khảo:

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

thú vị, nhưng tôi không có 'a: not struct và' a: null làm ràng buộc. – hammett

4

Lý do cho sự lỗi là kiểm tra kiểu bị nhầm lẫn vì nó không thể làm việc ra các loại, giải pháp - tương tự như pad là để thêm chú thích loại

let (|SysAware|_|) (t:obj) = 
    match t with 
    | :? ISysAware as p -> Some(p) 
    | _ -> None 
Các vấn đề liên quan