在尝试学习构造函数约束的使用时,我希望以下内容是可能的。
type Foo<'T when 'T : (new : int -> 'T)> = {Bar: 'T}
但这并不编译,只是返回错误
'new'约束必须采用一个类型为'unit'的参数,并返回构造的类型
似乎应该调用约束";无参数构造函数约束";因为我无法编译除此之外的任何其他表单。
type Foo<'T when 'T : (new : unit-> 'T)> = {Bar: 'T}
构造函数约束是否可以用于约束泛型类型构造函数,使其具有除unit
之外的特定签名?
如注释中所述,.NET对约束的支持是有限的,并且只支持(i(无参数构造函数和(ii(接口的实现。
F#对普通泛型类型参数遵循相同的构造,但它也有静态解析的类型参数,写为^T
,可以具有更具表达性的约束。这些并没有编译为.NET约束,而是在编译过程中被删除,因此还有其他约束。
一个类似于使用静态memnber约束的例子看起来是这样的:
type Foo<'T> =
{ Bar : 'T }
static member inline Demo< ^S when ^S : (static member Create : int -> ^S)>() =
{ Bar = (^S : (static member Create : int -> ^S) (10)) }
约束需要在内联成员(或内联函数(上,所以我定义了一个泛型类型Foo<'T>
,它有一个静态成员Demo
,可以用任何具有取int的Create
方法的类型调用。例如:
type Sample(n:int) =
member x.N = n
static member Create(n:int) = Sample(n)
现在,我们可以用Sample
作为类型参数调用Foo.Demo
,并返回使用10
作为初始化值创建的Foo<Sample>
:
let f = Foo<_>.Demo<Sample>()