我有以下代码:
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/