2012-03-09 18 views
11

El primer partido funciona, pero no el segundo. ¿Hay alguna manera de coincidir sin declarar variables, además de usar una cadena de if/elif?coincide con typeof en fsharp

(Nota que utilizo la elem valor, mientras que la variable t)

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

estaba tratando de igualar dependiendo del tipo subyacente de un objeto o si era simplemente confundido acerca de su resultado? –

+0

no Tengo el tipo, y el tipo subyacente de mi variable de tipo siempre será Tipo. – nicolas

Respuesta

12

Su primer patrón realidad no coincide con typeof<string>. Vincula propType a un nuevo valor t sombreando el t anterior que es igual a typeof<string>.

Dado que typeof<string> no es un literal, el segundo patrón no funciona tan bien (aunque es un patrón redundante en su ejemplo). Usted tiene que utilizar when guardia de la siguiente manera:

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

de hecho. trampa para novatos Voy a volver a probar el partido ... – nicolas

6

Si usted está tratando de coincidir con el tipo de un valor, puede utilizar el:? operador

Ejemplo:

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

en mi caso toMatch es el tipo en sí. entonces solo los guardias trabajan afaik. – nicolas

+0

Ok, no importa;) –

+1

Esta no fue la respuesta a esta pregunta en particular, pero fue a mi pregunta. :) –