2012-03-09 12 views
11

Pierwszy mecz działa, ale nie drugi. Czy istnieje sposób dopasowania bez deklarowania zmiennych, oprócz użycia łańcucha if/elif?mecz z typeof w fsharp

(zauważ, że używam wartość elem, natomiast dopasować zmiennej t)

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

Czy starasz się dopasować w zależności od bazowego typu obiektu lub były po prostu zdziwiony o swoim związku? –

+0

Nie Mam typ, a podstawowym typem mojej zmiennej typu zawsze będzie Typ. – nicolas

Odpowiedz

12

Twój pierwszy wzór faktycznie nie pasuje typeof<string>. Wiąże on propType z nową wartością t przesłoniętą poprzednią wartością t, która jest równa typeof<string>.

Ponieważ typeof<string> nie jest dosłowny, drugi wzór nie działa tak dobrze (chociaż w twoim przykładzie jest to wzór nadmiarowy). Musisz użyć when straży następująco:

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

. pułapka dla początkujących. Odpowiem ponownie o meczu ... – nicolas

6

Jeśli próbujesz dopasować przeciwko rodzaju wartości, można użyć: Operator

Przykład:

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

w moim przypadku toMatch to sam typ. więc tylko strażnicy działają afaik. – nicolas

+0

OK, nieważne;) –

+1

To nie była odpowiedź na to konkretne pytanie, ale było to na moje pytanie. :) –