Возможно, сообщение об ошибке сформулировано слишком расплывчато. Дело не в том, что тип Pet
не имеет подтипы, а в том, что он не может иметь подтипы.
Поскольку BMW
является классом, он может иметь подтип из другой сборки, который был скомпилирован после того, где определен сам BMW
.
Но для Pet
этого не может быть, потому что типы сумм не могут иметь подтипов, и поэтому сопоставление наследования для этих типов запрещено.
Также обратите внимание, что источником ошибки является тип переменной, которая соответствует, а не тип шаблона. Так, например, это скомпилируется без ошибок:
let n : obj = null
match n with
| :? Pet -> "is a pet"
| _ -> "no idea"
Это работает, потому что n
имеет тип obj
, который имеет , имеет подтипы, из которых Pet
это один (это. NET в конце концов, все является объектом). Но сопоставление с вашей переменной cat
не работает, потому что эта переменная имеет тип, не имеющий подтипов.