为什么不理解这个通用成员约束
Why is this generic member constraint not understood
给定以下函数定义
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.
我有点困惑这里还需要什么其他类型的注释。
谁能解释一下?
我认为正确的做法是:
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)
给定以下函数定义
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.
我有点困惑这里还需要什么其他类型的注释。 谁能解释一下?
我认为正确的做法是:
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)