gpt4 book ai didi

generics - 为什么这个通用成员约束不被理解

转载 作者:行者123 更新时间:2023-12-01 19:57:49 26 4
gpt4 key购买 nike

给出以下函数定义

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)

关于generics - 为什么这个通用成员约束不被理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29494606/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com