.Item
メソッドを既に実装している .Net ライブラリがあります。
namespace Library2
type A() =
member m.Item with get(a: string) = printfn "get a string"
member m.Item with get(a: int) = printfn "simple slice"
このライブラリを使用するコードでは、同じ名前のメソッドを 1 つ追加します (したがって、 ですoptional extensions
)。
#r @"Library2.dll"
open Library2
type A with
member m.Item with get(a: bool) =
printfn "get a bool"
次の例の最後の行はコンパイルされません。
let a = new A()
a.["good"]
a.[10]
a.[true]
F# docは次のように述べています。
拡張メソッドを仮想メソッドまたは抽象メソッドにすることはできません。同じ名前の他のメソッドをオーバーロードできますが、あいまいな呼び出しの場合、コンパイラは非拡張メソッドを優先します。
これは、同じ型シグネチャで拡張できないことを意味し.ToString/.GetHashCode
ますが、ここでは別の型シグネチャを使用します。新しいメソッドが拡張されないのはなぜですか?