Seh*_*cht 8 f# casting overloading ambiguous-call overload-resolution
这不是关于Windows窗体,它只是针对"背景".
当我遇到AddRange
一个MenuStrip.Items
需要ToolStripMenuItem
投入的错误时,我正在玩Windows FormsToolStripItem
但是我已经有AddRange
一个Form.Controls
之前并不要求强制转换.
经过一些实验后,我设法发现当有多个重载时发生错误,AddRange
所以我试图验证我的想法:
type Foo () = class end
type Bar () = inherit Foo ()
type FooCollection () = class end // not really necessary
type Test1 () =
member __.AddRange (col: FooCollection) = () // could be an int or anything instead
member __.AddRange (foos: Foo []) = ()
type Test2 () = member __.AddRange (foos: Foo []) = ()
let lst1, lst2 = Test1 (), Test2 ()
lst1.AddRange [|Bar ()|] // error: have to explicitely cast => [|Bar () :> Foo|]
lst2.AddRange [|Bar ()|] // works
Run Code Online (Sandbox Code Playgroud)
问题只是为什么; 从我的观点来看,这个电话并不含糊
阅读14.4.3 F# 规范后(由Gustavo暗示,向他致敬)
F# 编译器确定是否在显式实例化之后、检查任何参数之前插入灵活性。
我知道永远不会为具有重载的方法插入灵活性,因为它需要参数检查才能选择。
归档时间: |
|
查看次数: |
89 次 |
最近记录: |