说,我有
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# 不能自动正确解析?(无论如何,F# 的重载决议的顺序是什么?总是Object
比它的继承类更受欢迎?)
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)