当使用带有度量单位类型参数的自定义类型时,我遇到编译器错误“本地调用的类型参数数量不正确”,我不明白为什么。
这个问题经历了不少编辑。现在看来错误是由编译器或IDE错误引起的。
我可以将其缩小到以下(在尝试重现时阅读以下几点):
type R<[<Measure>] 'u> (f : float<'u>) =
member r.Member = f
let get (r : R<_>) = r.Member
let foo =
let problem _ = List.map get
problem // Error: Incorrect number of type arguments to local call
最后一行给出了错误,这是特别奇怪的,因为它只是返回已经定义的标识符。我正在编译库或可执行文件。一些重要的复制观察:
IntelliSense 不预测此错误。需要进行实际编译才能看到它。
在使用优化进行编译时,我还没有看到错误。 (对于复制,请使用例如Visual Studio中的默认调试编译。感谢Freenode上的zapu指出这一点。)
我还没有看到F#interactive中的错误。
删除problem
(_
)的无用参数会使错误消失。
将problem
的let-binding从foo
移出会使错误消失。 这可能与编译作为F#函数有关吗?我听说围绕 problem
类型的附加括号表示这一点。
删除度量单位使用会使错误消失。
将problem
标记为inline
会使错误消失。
许多看似无关紧要的更改会删除错误。但在实际使用案例中并不容易,特别是在我尝试之前我不知道更改是否修复了错误。
我对这方面的任何暗示感到高兴。是什么导致的?这是一个错误,如果是这样,它是否已知?如何避免?
版本这是使用F#3.0到3.1.2的版本测试的。我安装了新的Visual Studio 2013社区版,并使用它提供的版本进行了测试,结果相同。它也出现在Visual Studio 2012(F#3.0)中。
更新:我已经要求其他人对此进行测试,这种行为通常可以在Visual Studio 2012或2013中重现。
答案 0 :(得分:1)
这确实是一个错误。我报告了它,它是由Andrew Kennedy在2015-01-30修复的; see this issue report for Visual F# on Github
有趣的副作用:这个问题的荒谬代码最终成为回归测试。 (特此公开域名,以防万一)
F#的未来版本应该不再存在此问题。感谢所有帮助复制,分析和修复它的人!