编译器错误“本地调用的类型参数数量不正确”

时间:2014-11-26 22:44:37

标签: f#

当使用带有度量单位类型参数的自定义类型时,我遇到编译器错误“本地调用的类型参数数量不正确”,我不明白为什么。

这个问题经历了不少编辑。现在看来错误是由编译器或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中重现。

1 个答案:

答案 0 :(得分:1)

这确实是一个错误。我报告了它,它是由Andrew Kennedy在2015-01-30修复的; see this issue report for Visual F# on Github

有趣的副作用:这个问题的荒谬代码最终成为回归测试。 (特此公开域名,以防万一)

F#的未来版本应该不再存在此问题。感谢所有帮助复制,分析和修复它的人!