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 a, T b)? - 但是F#将Array.BinarySearch([|2;3|], 2)解析为BinarySearch(T[]array, T value),而不是BinarySearch(Array array, Object value)?
test.Test<_>(3)
吗? - svick