看起来不支持在将方法视为第一类值时提供类型参数。我检查了F# 规范,这里有一些重要的部分:
14.2.2 Item-Qualified Lookup
[如果应用程序表达式以:开头]
<types>
expr,然后<types>
用作类型参数和expr
表达式参数。
- expr,然后使用 expr 作为表达式参数。
- 否则不使用表达式参数或类型参数。
- 如果 [method] 用
RequiresExplicitTypeArguments
属性标记,则必须给出显式类型参数。
如果您指定类型参数和参数,则适用第一种情况,但正如您所见,规范也需要一些实际参数。不过,我不太确定这背后的动机是什么。
无论如何,如果您在成员的类型签名中的任何位置使用类型参数,那么您可以使用如下类型注释来指定它:
type Foo() =
member this.Bar<´T> (arg0:string) : ´T =
Unchecked.defaultof<´T>
let f = new Foo()
"string" |> (f.Bar : _ -> Int32)
另一方面,如果您不在签名中的任何地方使用类型参数,那么我不太确定您为什么首先需要它。如果您只需要它进行一些运行时处理,那么您可以将运行时类型表示作为参数:
type Foo() =
member this.Bar (t:Type) (arg0:string) = ()
let f = new Foo()
"string" |> f.Bar typeof<Int32>