根据MSDN
将参数传递给方法时会自动应用向上转换 在对象类型上。但是,对于模块中的let-bound函数, 除非参数类型声明为a,否则upcasting不是自动的 灵活的类型。
但是
type C() =
member this.T() = ()
type D() =
inherit C()
let myfun (x: C)=
()
let d = D()
myfun d
我根本不需要上传。
答案 0 :(得分:4)
查看F# spec所说的内容:
这意味着推断类型在参数位置包含未密封类型的F#函数可以在调用时传递子类型,而不需要显式的向上转换。例如:
(示例显示与您的几乎相同)
另请注意,为了让绑定函数自动转换,除非在某些情况下,例如在组成参数时,如果您的函数是:
let myfun (x: C option)=
()
不再自动投降。