向通用函数定义添加多个约束(为什么我必须内联)?

rob*_*kuz 0 generics f#

我想为我的泛型函数添加2个约束.构造函数约束和成员约束.

let somefn<'T when 'T : (new : unit ->  'T) and 'T : (member Add : 'T -> unit)> v = new 'T()
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

/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.
Run Code Online (Sandbox Code Playgroud)

我真的不明白这个错误信息.

仅当我将定义更改为:

let inline somefn<'T when 'T : (new : unit ->  'T) and 'T : (member Add : 'T -> ...
Run Code Online (Sandbox Code Playgroud)

它开始工作.

任何人都可以解释一下.

kvb*_*kvb 6

通用类型参数的成员约束仅支持内联定义,因为.NET类型系统不支持它们,因此无法将您的定义编译为vanilla .NET泛型函数.相反,编译器将在每个调用站点内联您的定义的副本(例如Add,如果您的定义使用它,则在调用站点调用正确的方法).