F# -> 泛型类型 - 多个非结构体

ebb*_*ebb 1 f#

我的第一个想法是:

type ManyNavigationPropertyInfo<'a,'b>(cfg:ManyNavigationPropertyConfiguration<'a, 'b>) =
Run Code Online (Sandbox Code Playgroud)

但是它解决了'a并且'bas obj,但它应该是类 - 因此我做了:

type ManyNavigationPropertyInfo<'a when 'a : not struct,'b when 'b : not struct>(cfg:ManyNavigationPropertyConfiguration<'a, 'b>) =

但这只是抛出一个错误说

类型名称中出现意外符号“,”。应为“>”或其他标记。

声明这种类型的正确方法是什么?

更新:

我的完整代码是:

type ManyNavigationPropertyInfo<'a,'b>(cfg:ManyNavigationPropertyConfiguration<'a, 'b>) =
    member x.WithMany (expr: Expr<'a -> ICollection<'b>>) = 
        cfg.WithMany(ToLinq(expr))
Run Code Online (Sandbox Code Playgroud)

并与2个编译器错误说,出现'a'bnot struct

Tom*_*cek 5

你的第一个想法是正确的。你应该可以只写:

type ManyNavigationPropertyInfo<'a,'b>
       (cfg:ManyNavigationPropertyConfiguration<'a, 'b>) =
   // ...
Run Code Online (Sandbox Code Playgroud)

问题可能出在类型主体的后面。根据您在正文中编写的内容,编译器认为'a并且'b必须是类型的obj(例如,您将这种类型的值传递到obj预期的某个地方,或者可能是更微妙的地方)。

您可以尝试在类的主体中添加类型注释 - 这通常有助于找到问题,因为当您对 F# 编译器解释与预期不同的位进行注释时,错误消息会发生变化。

要解决您的问题中的直接问题 - 指定约束的语法有点不同(首先编写所有类型变量,然后编写约束):

type ManyNavigationPropertyInfo<'a, 'b when 'a : not struct and 'b : not struct>( ... )
Run Code Online (Sandbox Code Playgroud)

(但如果你可以发布更多的代码,也许有人可以给出具体的建议。)