类中let绑定的显式类型参数

时间:2012-11-15 11:05:16

标签: .net generics f#

当我尝试创建像

这样的类时
type MyType () =
    let func<'T> () = ()

编译器说有错误:

  

显式类型参数只能用于模块或成员绑定

但是MSDN说:

  

模块级别,类型或计算表达式中的let绑定可以具有显式类型参数。表达式中的let绑定(例如在函数定义中)不能具有类型参数。

为什么文档和编译器说不同的东西?

2 个答案:

答案 0 :(得分:5)

这似乎是对类中let绑定的语法限制。但是,您仍然可以定义通用本地函数,只需在类型注释中指定类型参数:

type MyType () =
   let func (x : 'T) : 'T = x

我不认为规范禁止显式语法,因为规范说类定义具有以下结构:

  

输入type-name patopt as-defnopt =
  类继承-DECL <子>选择
  类功能或值-defns <子>选择
  型DEFN元素

class-or-value-defn 定义为:

  

class-function-or-value-defn:= attributes opt static opt let rec opt function-or-value-defns

其中 function-or-value-defns 可以是具有显式类型参数的函数定义:

  

function-defn:=
   inline opt access opt ident-or-op typar-defns opt argument-pats return-typeopt = expr

答案 1 :(得分:2)

要添加Tomas的答案,如果您需要类型参数但不具有该类型的值,则可以使用带有幻像类型参数的类型。 e.g:

open System

type Foo() =
    member x.PrintType<'T> () = printfn "%s" typeof<'T>.Name

type TypeParameter<'a> = TP

let foo = Foo ()

let callFoo (typeParameter : TypeParameter<'a>) =
    foo.PrintType<'a> ()

callFoo (TP : TypeParameter<string>)
callFoo (TP : TypeParameter<DateTime>)