在F#中使用typeof匹配

14
第一个匹配可以正常工作,但第二个无法匹配。 除了使用if / elif链之外,是否有一种不声明变量的匹配方式?(请注意,我使用元素值elem,而匹配变量t)
  let t = typeof<string>
  match propType with
  | t               ->  elem.GetValueAsString() :> obj
  | typeof<string>  ->  elem.GetValueAsString() :> obj

你是想根据对象的底层类型进行匹配,还是对结果感到困惑? - Cédric Rup
我有这个类型,而且我的类型变量的底层类型将始终是Type。 - nicolas
2个回答

15
你的第一个模式实际上并不匹配 typeof<string>。它将 propType 绑定到一个新值 t,覆盖了之前的 t,而后者等于 typeof<string>
由于 typeof<string> 不是字面量,第二个模式也无法正常工作(尽管在你的示例中它是多余的)。你必须使用 when 保护,如下所示:
  match propType with
  | t when t = typeof<string> -> elem.GetValueAsString() :> obj
  | t ->  elem.GetValueAsString() :> obj

9

如果你想匹配一个值的类型,你可以使用 :? 运算符。

示例:

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

2
在我的情况下,toMatch 就是类型本身。所以据我所知,只有 guards 能够工作。 - nicolas
1
这不是这个特定问题的答案,但它回答了我的问题。 :) - Kevin Li

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接