向通用函数定义添加多个约束(为什么我必须内联)?
Add multiple constraints to a generic function definition (why must I inline)?
我想为我的泛型函数添加 2 个约束。构造函数约束和成员约束。
let somefn<'T when 'T : (new : unit -> 'T) and 'T : (member Add : 'T -> unit)> v = new 'T()
但是我收到以下错误:
/stdin(32,5): error FS0670: This code is not sufficiently generic.
The type variable ^T when ^T : (new : unit -> ^T) and
^T : (member Add : ^T * ^T -> unit)
could not be generalized because it would escape its scope.
我真的不明白这个错误信息。
仅当我将定义更改为:
let inline somefn<'T when 'T : (new : unit -> 'T) and 'T : (member Add : 'T -> ...
它开始工作了。
谁能解释一下。
仅内联定义支持泛型类型参数的成员约束,因为 .NET 类型系统不支持它们,因此您的定义无法编译为 vanilla .NET 泛型函数。相反,编译器将在每个调用点内联您的定义的副本(例如,如果您的定义使用它,则在调用点调用正确的 Add
方法)。
我想为我的泛型函数添加 2 个约束。构造函数约束和成员约束。
let somefn<'T when 'T : (new : unit -> 'T) and 'T : (member Add : 'T -> unit)> v = new 'T()
但是我收到以下错误:
/stdin(32,5): error FS0670: This code is not sufficiently generic.
The type variable ^T when ^T : (new : unit -> ^T) and
^T : (member Add : ^T * ^T -> unit)
could not be generalized because it would escape its scope.
我真的不明白这个错误信息。
仅当我将定义更改为:
let inline somefn<'T when 'T : (new : unit -> 'T) and 'T : (member Add : 'T -> ...
它开始工作了。
谁能解释一下。
仅内联定义支持泛型类型参数的成员约束,因为 .NET 类型系统不支持它们,因此您的定义无法编译为 vanilla .NET 泛型函数。相反,编译器将在每个调用点内联您的定义的副本(例如,如果您的定义使用它,则在调用点调用正确的 Add
方法)。