为什么不了解此通用成员约束

时间:2015-04-07 14:53:24

标签: generics f#

给出以下函数定义

let inline add<'X,'Y when 'X : (member Add : 'Y -> unit)> 
    (target:'X) (value:'Y) = target.Add value  

为什么我会收到此错误?

  target.Add v
----^^^^^^^^^^
stdin(64,5): error FS0072: Lookup on object of indeterminate type based on 
information prior to this program point. A type annotation may be needed 
prior to this program point to constrain the type of the object. This may 
allow the lookup to be resolved.

我对这里需要的其他类型注释感到有点困惑。 有人可以解释一下吗?

1 个答案:

答案 0 :(得分:5)

我认为正确的方法是:

let inline add (target : ^X when ^X : (member Add : ^Y -> unit)) (value : ^Y) = 
    (^X : (member Add :  ^Y -> unit) target, value)

答案和评论in this answer解释了为什么需要这种语法。

我们可以在这里看到它:

let l = System.Collections.Generic.List<string>()
add l "Hello"

kvb还指出,鉴于成员约束现在在正文中,不需要在参数中明确定义它,因为编译器可以推断它,所以我们可以稍微清理一下:

let inline add target value = 
    (^X : (member Add : ^Y -> unit) target, value)