2012-03-09 5 views
11

Kết quả phù hợp đầu tiên, nhưng không phải là kết quả thứ hai. Có cách nào để khớp mà không khai báo biến, bên cạnh sử dụng chuỗi if/elif không?phù hợp với typeof trong fsharp

(Lưu ý rằng tôi sử dụng elem giá trị, trong khi tôi phù hợp với biến t)

let t = typeof<string> 
    match propType with 
    | t    -> elem.GetValueAsString() :> obj 
    | typeof<string> -> elem.GetValueAsString() :> obj 
+0

Were bạn cố gắng để phù hợp tùy thuộc loại cơ bản của một đối tượng hoặc là bạn chỉ hoang mang về kết quả của bạn? –

+0

không, tôi có loại và loại cơ bản của biến loại của tôi sẽ luôn là Loại. – nicolas

Trả lời

12

mẫu đầu tiên của bạn thực sự không phù hợp typeof<string>. Nó liên kết propType với giá trị mới t che khuất t trước đó bằng với typeof<string>.

typeof<string> không phải là chữ, mẫu thứ hai cũng không hoạt động (mặc dù đó là mẫu thừa trong ví dụ của bạn). Bạn phải sử dụng bảo vệ when như sau:

match propType with 
    | t when t = typeof<string> -> elem.GetValueAsString() :> obj 
    | t -> elem.GetValueAsString() :> obj 
+0

thực sự. bẫy mới. Tôi sẽ rtfm về trận đấu ... – nicolas

6

Nếu bạn đang cố gắng khớp với loại giá trị, bạn có thể sử dụng:? điều hành

Ví dụ:

let testMatch (toMatch:obj) = match toMatch with 
         | :? string as s -> s.Split([|';'|]).[0] 
         | :? int as i -> (i+1).ToString() 
         | _ -> String.Empty 
+2

trong trường hợp của tôi toMatch là chính nó. do đó chỉ có lính gác hoạt động afaik. – nicolas

+0

Ok, đừng bận tâm;) –

+1

Đây không phải là câu trả lời cho câu hỏi cụ thể này, nhưng đó là câu hỏi của tôi. :) –