言う、私は持っています
member this.Test (x: 'a) = printfn "generic"
1
member this.Test (x: Object) = printfn "non generic"
2
C#で呼んだら
var a = test.Test(3); // calls generic version
var b = test.Test((object)3); // calls non generic version
var c = test.Test<object>(3); // calls generic version
ただし、F#では
let d = test.Test(3); // calls non generic version
let e = test.Test<int>(3); // calls generic version
したがって、正しいオーバーロードされたメソッドを取得するために、型アノテーションを追加する必要があります。これは本当ですか?もしそうなら、引数の型がすでに推測されているのに、なぜF#が自動的に正しく解決されないのですか?Object
(とにかく、F#のオーバーロード解決の順序は何ですか?継承されたクラスよりも常に優先されますか?)
メソッドに両方のオーバーロードがあり、一方が型として引数を取りObject
、もう一方が汎用であり、両方が同じ型を返す場合は、少し危険です。(この例のように、またはAssert.AreEqual
単体テストのように)、通知すらなくても間違ったオーバーロードが発生する可能性が非常に高くなります(コンパイラエラーにはなりません)。それは問題ではないでしょうか?
アップデート:
誰かが説明できますか
F#が解決
Assert.AreEqual(3, 5)
されるAssert.AreEqual(Object a, Object b)
が解決されない理由Assert.AreEqual<T>(T a, T b)
しかし、F#は次のように解決
Array.BinarySearch([|2;3|], 2)
されますBinarySearch<T>(T[]array, T value)
が、BinarySearch(Array array, Object value)