Ваша первая мысль верна. Вы должны быть в состоянии просто написать:
type ManyNavigationPropertyInfo<'a,'b>
(cfg:ManyNavigationPropertyConfiguration<'a, 'b>) =
// ...
Проблема, вероятно, где-то позже в теле типа. Исходя из того, что вы написали в теле, компилятор считает, что 'a
и 'b
должны иметь тип obj
(например, вы передаете значения этого типа где-то, где ожидается obj
, или, возможно, что-то более тонкое ).
Вы можете попробовать добавить аннотации типов в теле класса - это обычно помогает найти проблему, потому что сообщение об ошибке изменяется, когда вы аннотируете бит, который компилятор F # интерпретирует иначе, чем вы ожидали.
Чтобы решить непосредственную проблему в вашем вопросе - синтаксис для указания ограничения немного отличается (сначала запишите все переменные типа, а затем ограничения):
type ManyNavigationPropertyInfo<'a, 'b when 'a : not struct and 'b : not struct>( ... )
(Но если вы можете разместить большую часть кода, возможно, кто-то может дать конкретный совет.)