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