我的第一个想法是:
type ManyNavigationPropertyInfo<'a,'b>(cfg:ManyNavigationPropertyConfiguration<'a, 'b>) =
然而它将'a
和'b
解析为obj
,但它应该是类 - 因此我做了:
输入ManyNavigationPropertyInfo&lt;'a 当'a:not struct,'b'b:not 结构&GT;(CFG:ManyNavigationPropertyConfiguration&LT;'一, 'b&gt;)=
但这只会引发错误
类型名称中的意外符号','。 预期'&gt;'或其他令牌。
声明这种类型的正确方法是什么?
更新
我的完整代码是:
type ManyNavigationPropertyInfo<'a,'b>(cfg:ManyNavigationPropertyConfiguration<'a, 'b>) =
member x.WithMany (expr: Expr<'a -> ICollection<'b>>) =
cfg.WithMany(ToLinq(expr))
它出现了2个编译器错误,指出'a
和'b
应为not struct
。
答案 0 :(得分:4)
你的第一个想法是正确的。你应该可以写:
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>( ... )
(但如果您可以发布更大部分的代码,也许有人可以给出具体的建议。)