如何正确匹配F#类类型

时间:2014-12-23 16:53:33

标签: f#

我正在使用C#对象类型,但我认为下面的代码段说明了我的问题。我无法找到与特定编译器警告相关的任何内容,"此类型测试或向下转发将始终保持" (当与C#类型匹配时,我得到"此规则永远不会匹配") This post类似,但似乎特定于模式匹配(使用if / then / else时结果如下)。

type Parent =
  val a : int
  new(a0) = { a = a0; }

type Child(a) =
  inherit Parent(a)

let MatchFunc (obj:Parent) =
  match obj with
  | :? Parent -> "Parent"
  | :? Child -> "Child"
  | _ -> "Neither"

let c = new Child(1)
MatchFunc c

1 个答案:

答案 0 :(得分:3)

obj被声明为Parent类型,因此第一个测试将始终匹配(并返回)。因此,第二种情况永远不会。

首先匹配最具体的类型,当类型相关时(在这种情况下首先针对Child):

let MatchFunc (obj:Parent) =
  match obj with
  | :? Child -> "Child"  
  | :? Parent -> "Parent"
  | _ -> "Neither"

请注意,如果您明确处理层次结构中的所有类型,则永远不会遇到最后一种情况,但是没有它会生成正确的警告(因为添加Parent的新子类会“破坏”模式)