我的第一个想法是:
type ManyNavigationPropertyInfo<'a,'b>(cfg:ManyNavigationPropertyConfiguration<'a, 'b>) =
然而,它将'a
和'b
解析为obj
,但它应该是类-因此我这样做:
类型ManyNavigationPropertyInfo<"当a: not结构体时,b: not结构体时struct> (cfg: ManyNavigationPropertyConfiguration<'," b>) =
但是会抛出一个错误说
类型名称中出现意外符号','。期望'>'或其他标记。
声明这种类型的正确方法是什么?
更新:
我的完整代码是:
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
你的第一个想法是正确的。你应该可以这样写:
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>( ... )
(但如果你可以张贴更大的代码部分,也许有人可以给出具体的建议)