F# - >通用类型 - 多个非结构

时间:2011-04-22 15:47:54

标签: f#

我的第一个想法是:

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

1 个答案:

答案 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>( ... )

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