私はすでに.Item
のメソッドを実装した.Netライブラリを持っています。このライブラリを使用するコードで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"
、私は(したがって、それはoptional extensions
ある)同じ名前の1つの余分方法を追加したい:
#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
を同じタイプのシグネチャでは拡張できないことを意味しますが、ここでは別のタイプのシグネチャを使用します。新しいメソッドを拡張できないのはなぜですか?元Library2.A
クラスでそれを見つけ、
public static class MyModule
{
public static void Item(this A a, bool b)
{
// whatever
}
}
コンパイラは.Item(...)
方法を探している、と失敗します。
私が奇妙なのは、Intellisenseが3つのオーバーロードをすべて表示していることです。 – Daniel
はい。これは私を混乱させます... –