我有以下代码:
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'不应该给出显式类型参数,因为它没有显式声明其类型参数
但是,如果我删除&lt;'T&gt;从getList调用然后我得到一个编译错误:
成员'List&lt;'T&gt; :unit - &gt;的IList&LT; '一&GT;'没有正确的类型来覆盖相应的抽象方法。所需的签名是'List&lt;'T&gt; :unit - &gt;的IList&LT; 'T&GT;'。
我该怎么办?
答案 0 :(得分:2)
您可以使用显式类型参数声明getList
:
let getList<'T> () : IList<'T> = upcast List<'T>()
然后您收到错误:
显式类型参数只能用于模块或成员绑定
如果您将let
绑定移动到与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