我有以下代码:
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 调用中删除 <'T>,则会出现编译错误:
成员 'List<'T> : unit -> IList<'a>' 没有覆盖相应抽象方法的正确类型。所需的签名是 'List<'T> : unit -> IList<'T>'。
我能做什么?
最佳答案
您可以使用显式类型参数声明 getList
:
let getList<'T> () : IList<'T> = upcast List<'T>()
然后你会得到一个错误:
Explicit type parameters may only be used on module or member bindings
如果您随后将 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# 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22744930/