3

我有以下代码

module File1

    let convert<'T> x = x

    type myType () =
        member this.first<'T> y =
            convert<'T> y
        member this.second<'T> ys =
            ys
            |> Seq.map this.first<'T>

最后'T我得到了错误Unexpected type arguments。例如,当我打电话let x = myType.first<int> "34"时,没有警告,一切都按预期工作。保留类型参数可以消除警告,并且程序有时会按预期运行。

谁能解释这里发生了什么?

谢谢

4

1 回答 1

4

简而言之,您的方法需要带有类型参数的显式参数。错误可以通过更改来修复

ys
|> Seq.map this.first<'T>

ys
|> Seq.map (fun y -> this.first<'T> y)

错误在这个优秀的答案中解释得非常清楚,这里不再赘述。请注意,错误消息已在 F# 2.0 和 F# 3.0 之间更改。

您实际上并没有'T在类型签名中使用任何地方,因此您可以轻松删除'T

如果您需要查询类型,我建议使用上面 Tomas 回答中的技术。

type Foo() = 
  member this.Bar (t:Type) (arg0:string) = ()

let f = new Foo() 
"string" |> f.Bar typeof<Int32>
于 2013-06-10T13:38:48.183 回答