我正在使用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
答案 0 :(得分:3)
obj
被声明为Parent
类型,因此第一个测试将始终匹配(并返回)。因此,第二种情况永远不会。
首先匹配最具体的类型,当类型相关时(在这种情况下首先针对Child
):
let MatchFunc (obj:Parent) =
match obj with
| :? Child -> "Child"
| :? Parent -> "Parent"
| _ -> "Neither"
请注意,如果您明确处理层次结构中的所有类型,则永远不会遇到最后一种情况,但是没有它会生成正确的警告(因为添加Parent
的新子类会“破坏”模式)