2012-03-09 53 views
11

第一個匹配有效,但不是第二個匹配。 除了使用if/elif鏈之外,是否有任何方法可以在不聲明變量的情況下進行匹配?匹配fsharp中的typeof

(請注意,我用的是價值ELEM,而我匹配變量t)

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

是你想根據底層對象的類型匹配還是你只是疑惑的結果呢? – 2012-03-09 15:12:19

+0

不,我有類型,我的類型變量的基礎類型將始終是類型。確實是 – nicolas 2012-03-09 16:22:14

回答

12

你的第一個模式實際上不匹配typeof<string>。它將propType綁定到一個新的值t,它隱藏了之前的t,這等於typeof<string>

由於typeof<string>不是文字,所以第二種模式不起作用(儘管它在您的示例中是冗餘模式)。你必須使用when後衛如下:

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

。新手陷阱。我將重新rtfm關於匹配... – nicolas 2012-03-09 10:46:35

6

如果你想對陣的值的類型,你可以使用?運營商

例子:

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

在我的情況toMatch是類型本身。所以只有衛兵工作afaik。 – nicolas 2012-03-09 16:21:10

+0

好的,沒關係;) – 2012-03-09 19:11:13

+1

這不是這個問題的答案,但它是我的問題。 :) – 2017-07-08 12:40:51