问题描述
你好
我刚刚注意到在使用鸭子类型和类型增强时的奇怪行为.这是代码:
I have just noticed a strange behavior when using duck typing and type augmentation. Here is the code:
命名空间测试
模块M1 =
类型System.Double with
静态成员doit(v:double)= v
let inline duck(v:^ a)=(^ a:(static member doit:^ a-> ^ a)(v))
let(v:System.Double)= 2.8
System.Double.doit(v) //好的
//类型检查器抱怨
鸭v
模块M2 =
类型A = CA
与
静态成员doit(v:A)= v
类型B = CB
//都可以
M1.duck CA
A.doit CA
模块M3 =
类型M2.B
与
静态成员doit(v:M2.B)= v
//类型检查器抱怨
M1.duck M2.CB
M2.B.doit(M2.CB) //好的
namespace Test
module M1 =
type System.Double with
static member doit (v:double) = v
let inline duck (v : ^a) = (^a : (static member doit: ^a -> ^a) (v))
let (v:System.Double) = 2.8
System.Double.doit(v) // ok
// type checker complains
duck v
module M2 =
type A = CA
with
static member doit (v:A) = v
type B = CB
// Both ok
M1.duck CA
A.doit CA
module M3 =
type M2.B
with
static member doit (v:M2.B) = v
// type checker complains
M1.duck M2.CB
M2.B.doit (M2.CB) // ok
有人对此行为有解释吗?
Has anyone an explanation to this behavior?
谢谢
致谢
让·克里斯托夫(Jean-Christophe)
Jean-Christophe
推荐答案
这篇关于鸭打字类型增强的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!