为什么在这个let绑定函数中不需要upcast?

时间:2014-11-06 23:37:16

标签: f#

根据MSDN

  

将参数传递给方法时会自动应用向上转换   在对象类型上。但是,对于模块中的let-bound函数,   除非参数类型声明为a,否则upcasting不是自动的   灵活的类型。

但是

type C() =
    member this.T() = ()
type D() =
    inherit C()

let myfun (x: C)=
    ()

let d = D()

myfun d

我根本不需要上传。

1 个答案:

答案 0 :(得分:4)

查看F# spec所说的内容:

这意味着推断类型在参数位置包含未密封类型的F#函数可以在调用时传递子类型,而不需要显式的向上转换。例如:

(示例显示与您的几乎相同)

另请注意,为了让绑定函数自动转换,除非在某些情况下,例如在组成参数时,如果您的函数是:

let myfun (x: C option)=
    ()

不再自动投降。