我老老实实地对此感到困惑.为什么不起作用 - 我是不是明确地说这'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)
MSDN:
在许多面向对象的语言中,上传是隐含的; 在F#中,规则略有不同.将参数传递给对象类型的方法时,将自动应用向上转换.但是,对于模块中的let-bound函数,upcasting不是自动的,除非将参数类型声明为灵活类型.
的
:>
运算符执行一个静态铸造,这意味着该铸件的成功是在编译时决定的.
最小的代码将是
let foo<'T when 'T :> View> (v:'T):View = v :> _
Run Code Online (Sandbox Code Playgroud)