Ho una libreria .Net che ha già implementato i metodi .Item
, ad es.Aggiunta di ulteriori metodi come estensioni di tipo in F #
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"
Nel codice che utilizza questa libreria, voglio aggiungere un metodo in più con lo stesso nome (quindi è optional extensions
):
#r @"Library2.dll"
open Library2
type A with
member m.Item with get(a: bool) =
printfn "get a bool"
L'ultima riga del seguente esempio non compila :
let a = new A()
a.["good"]
a.[10]
a.[true]
Il F# doc dice:
I metodi di estensione non possono essere metodi virtuali o astratti. Possono sovraccaricare altri metodi con lo stesso nome, ma il compilatore dà la preferenza ai metodi di non estensione nel caso di una chiamata ambigua.
Ciò significa che non è possibile estendere .ToString/.GetHashCode
con la stessa firma di tipo, ma qui utilizzo una diversa firma di tipo. Perché il nuovo metodo non può essere esteso?
Quello che trovo strano è che Intellisense mostra tutti e tre i sovraccarichi. – Daniel
si. questo mi confonde ... –