当存在不同的过载时,强制转发

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)

问题只是为什么; 从我的观点来看,这个电话并不含糊

Seh*_*cht 2

阅读14.4.3 F# 规范后(由Gustavo暗示,向他致敬)

F# 编译器确定是否在显式实例化之后、检查任何参数之前插入灵活性。

我知道永远不会为具有重载的方法插入灵活性,因为它需要参数检查才能选择。