“意外类型参数”是什么意思?

时间:2013-06-10 13:14:07

标签: f#

我有以下代码

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"时,没有警告,一切都按预期工作。离开类型参数会消除警告,并且程序在某些时候会按预期运行。

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

谢谢

1 个答案:

答案 0 :(得分:4)

简而言之,您需要使用类型参数为您的方法提供显式参数。可以通过更改

来修复错误
ys
|> Seq.map this.first<'T>

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

this excellent answer中非常清楚地解释了错误,我在此不再重复。请注意,错误消息已在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>