2012-03-09 5 views
11

最初の一致は機能しますが、2番目の一致は機能しません。 if/elifのチェーンを使う以外に、変数を宣言することなく一致させる方法はありますか?はfsharpのtypeofと一致します

(私は変数tと一致している間、私は、値のelemを使用することに注意してください)

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

は、オブジェクトの基になる型に依存一致しようとしていたか、あなたの結果についてちょうど困惑でしたか? –

+0

いいえ私は型を持っており、型変数の基になる型は常に型です。確かに – nicolas

答えて

12

あなたの最初のパターンは、実際にtypeof<string>と一致していません。これは、tをシャドウする新しい値tpropTypeをバインドします。これはtypeof<string>に等しくなります。

typeof<string>はリテラルではないため、2番目のパターンはうまく機能しません(例では冗長パターンですが)。あなたは次のようにwhenガードを使用する必要があります。

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

。初心者の罠。私は一致することをre-rtfmします... – nicolas

6

あなたは値の型にマッチしようとしている場合は、あなたが使用することができますか?オペレータ

例:

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

私の場合では、マッチはタイプそのものです。それで警備員だけがアフリカに働く。 – nicolas

+0

OK、決して心配しない;) –

+1

これはこの特定の質問に対する答えではありませんでしたが、それは私の質問でした。 :) –

関連する問題