Похоже, что предоставление параметров типа при обработке метода как значения первого класса не поддерживается. Я проверил F # спецификацию и вот несколько важных битов:
14.2.2 Поиск по номеру изделия
[Если выражение приложения начинается с:]
<types>
expr , затем используйте <types>
в качестве аргументов типа и expr
в качестве выражения
аргумент.
- expr , затем используйте expr в качестве аргумента выражения.
- в противном случае не используйте аргументы выражения или аргументы типа.
- Если [метод] помечен
RequiresExplicitTypeArguments
атрибут, тогда аргументы явного типа должны иметь
было дано.
Если вы указываете аргументы типа и аргументы, то применяется первый случай, но, как вы можете видеть, спецификация также требует некоторых реальных аргументов. Я не совсем уверен, что является причиной этого.
В любом случае, если вы используете параметр типа где-либо в сигнатуре типа члена, то вы можете указать его с помощью аннотаций типа, таких как:
type Foo() =
member this.Bar<´T> (arg0:string) : ´T =
Unchecked.defaultof<´T>
let f = new Foo()
"string" |> (f.Bar : _ -> Int32)
С другой стороны, если вы не используете параметр type где-либо в сигнатуре, то я не совсем уверен, зачем он вам нужен. Если вам это нужно только для некоторой обработки во время выполнения, вы можете принять представление типа времени выполнения в качестве аргумента:
type Foo() =
member this.Bar (t:Type) (arg0:string) = ()
let f = new Foo()
"string" |> f.Bar typeof<Int32>