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

  • 本文关键字:结构 泛型类型 f#
  • 更新时间 :
  • 英文 :


我的第一个想法是:

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

(但如果你可以张贴更大的代码部分,也许有人可以给出具体的建议)

最新更新