タイプ「obj」のオブジェクトobj1を実際のタイプに応じて一致させたい。問題は、リストタイプのタイプチェックパターン(以下の例の2番目のパターン)がF#リストと一致しないことです。
let obj1 = [1;2;3] :> obj
match obj1 with
| :? System.Array as a -> printfn "it's an array: %A" a
| :? List<_> as l -> printfn "It's a list: %A" l
| _ -> printfn "other type"
「その他のタイプ」を出力しますが、「リストです:[1; 2; 3]」と予想します。
リストタイプを正しくチェックする方法は?
ダニエル・ファビアンはすでに彼の答えで問題を説明しています。
彼のソリューションを実装する1つの方法は、アクティブパターンを使用することです。
let (|IsList|_|) (candidate : obj) =
let t = candidate.GetType()
if t.IsGenericType && t.GetGenericTypeDefinition() = typedefof<list<_>>
then Some (candidate :?> System.Collections.IEnumerable)
else None
これで、このアクティブなパターンを使用するように一致を変更できます。
let obj1 = [1;2;3] :> obj
match obj1 with
| :? System.Array as a -> printfn "it's an array: %A" a
| IsList l -> printfn "It's a list: %A" l
| _ -> printfn "other type"
これは印刷します:
> It's a list: [1; 2; 3]
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加