【发布时间】:2013-01-31 00:28:33
【问题描述】:
说,我有
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)
【问题讨论】:
-
你似乎遗漏了一个问号……某处。
-
@ildjarn 好的,我会添加一些
-
你试过
test.Test<_>(3)吗?
标签: f#