【问题标题】:Add multiple constraints to a generic function definition (why must I inline)?向通用函数定义添加多个约束(为什么必须内联)?
【发布时间】:2015-04-07 14:23:31
【问题描述】:

我想为我的通用函数添加 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 -> ...

它开始工作了。

谁能解释一下。

【问题讨论】:

    标签: generics f#


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多