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

Van*_*oiy 6 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
Run Code Online (Sandbox Code Playgroud)

最后一行给出了错误,这是特别奇怪的,因为它只是返回已经定义的标识符.我正在编译库或可执行文件.一些重要的复制观察:

  • IntelliSense 无法预测此错误.需要进行实际编译才能看到它.

  • 在使用优化进行编译时,我还没有看到错误.(对于复制,请使用例如Visual Studio中的默认调试编译.感谢Freenode上的zapu指出这一点.)

  • 我还没有看到F#interactive中的错误.

  • 删除problem(the _)的无用参数会使错误消失.

  • 移动let-binding of problemout foo会使错误消失.这可能与编译作为F#函数有关吗?我听说这是通过围绕类型的附加括号表示的 problem.

  • 删除度量单位使用会使错误消失.

  • 标记probleminline使错误消失.

许多看似无关紧要的更改消除了错误.但在实际使用案例中并不容易,特别是在我尝试之前我不知道更改是否修复了错误.

我对这方面的任何暗示感到高兴.是什么导致的?这是一个错误,如果是这样,它是否已知?怎么可以避免?

版本使用F#3.0到3.1.2的版本进行了测试.我安装了新的Visual Studio 2013社区版,并使用它提供的版本进行了测试,结果相同.它也出现在Visual Studio 2012(F#3.0)中.

更新:我已经要求其他人对此进行测试,这种行为通常可以在Visual Studio 2012或2013中重现.

Van*_*oiy 1

这确实是一个错误。我报告了这个问题,并由 Andrew Kennedy 于 2015 年 1 月 30 日修复;请参阅 Github 上的 Visual F# 问题报告

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

F# 的未来版本应该不再有这个问题。感谢所有帮助重现、分析和修复它的人!