2012-03-09 12 views
11

La prima partita funziona, ma non la seconda. C'è un modo per farlo senza dichiarare variabili, oltre ad usare una catena di if/elif?corrisponde a typeof in fsharp

(Si noti che io uso l'elem valore, mentre abbino la variabile t)

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

stavi cercando di abbinare a seconda del tipo sottostante di un oggetto o eri solo perplesso circa il vostro risultato? –

+0

no, ho il tipo, e il tipo sottostante della mia variabile di tipo sarà sempre Type. – nicolas

risposta

12

Il tuo primo modello in realtà non corrisponde typeof<string>. Lega lo propType a un nuovo valore t ombreggiato rispetto allo t precedente uguale a typeof<string>.

Poiché typeof<string> non è un valore letterale, il secondo modello non funziona altrettanto bene (sebbene sia un modello ridondante nell'esempio). Devi usare when guardia come segue:

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

davvero. trappola per principianti. Mi ricorderò della corrispondenza ... – nicolas

6

se si sta cercando di abbinare contro il tipo di un valore, è possibile utilizzare il:? operatore

Esempio:

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

nel mio caso toMatch è il tipo stesso. quindi solo le guardie lavorano afaik. – nicolas

+0

Ok, non importa;) –

+1

Questa non era la risposta a questa particolare domanda, ma era alla mia domanda. :) –