我有以下代码:

type IQuery =
    abstract List<'T> : unit -> IList<'T>


let create (str)=
   let getList () : IList<'T> = upcast List<'T>()
   { new IQuery with
      member this.List<'T>() = getList<'T>()

最后一行给我一个警告,指出:

不应为方法或函数'getList'提供显式类型参数,因为它没有显式声明其类型参数

但是,如果我从getList调用中删除,则会出现编译错误,如下所示:

成员'List :unit-> IList '没有正确的类型来覆盖相应的抽象方法。所需的签名为'List :unit-> IList '。

我能做什么 ?

最佳答案

您可以使用显式类型参数声明getList:

let getList<'T> () : IList<'T> = upcast List<'T>()

然后,您会得到一个错误:

显式类型参数只能在模块或成员绑定(bind)上使用

然后,如果将let绑定(bind)移动到与type相同的作用域的顶层,则所有操作都可以:
type IQuery =
    abstract List<'T> : unit -> IList<'T>

let getList<'T> () : IList<'T> = upcast List<'T>()

let create (str) =
       { new IQuery with
          member this.List<'T>() = getList<'T>()
       }

如果您的真实代码中的getList仅在create的范围内使用值,例如str,则需要将它们作为显式参数添加到getList中。

关于f# - 内部函数的F#泛型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22744930/

10-10 02:35