F#中的一般限制

Ram*_*nir 0 generics f#

到现在为止,我有一个类似这样的课程:

type C<'a when 'a :> A> (...)
Run Code Online (Sandbox Code Playgroud)

但现在我创建了一个新的B型:

type B (...) =
    inherit A()
Run Code Online (Sandbox Code Playgroud)

但我不希望C支持B,这不编译:

type C<'a when 'a :> A and not 'a :> B> (...)
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Jon*_*eet 9

你不能也不应该.如果B是A,那么C应该处理它.如果C不能处理B是合理的,那么B不应该从A中得出.否则你实际上是在打破Liskov的替换原则(或者至少是它的变体).

当你声明B继承自A时,你说它可以用作A.如果不是这样,你不应该使用继承.