Upcasting和泛型

rob*_*kuz 0 generics f#

我老老实实地对此感到困惑.为什么不起作用 - 我是不是明确地说这'T确实是一个View

let foo<'T when 'T :> View> (v:'T):View = v

error FS0001: This expression was expected to have type View 
but here has type 'T
Run Code Online (Sandbox Code Playgroud)

byt*_*ter 5

MSDN:

在许多面向对象的语言中,上传是隐含的; 在F#中,规则略有不同.将参数传递给对象类型的方法时,将自动应用向上转换.但是,对于模块中的let-bound函数,upcasting不是自动的,除非将参数类型声明为灵活类型.

:>运算符执行一个静态铸造,这意味着该铸件的成功是在编译时决定的.

最小的代码将是

let foo<'T when 'T :> View> (v:'T):View = v :> _
Run Code Online (Sandbox Code Playgroud)

  • 为什么不使用[灵活类型](https://msdn.microsoft.com/en-us/library/dd233198.aspx)?`让foo(v:#View)= v:>查看` (2认同)