在Visual Studio 2012中使用F#进行内联函数的代码覆盖

时间:2013-03-01 20:58:11

标签: visual-studio-2012 f# code-coverage inline

Visual Studio 2012中的代码覆盖率工具将所有inline函数标记为未覆盖,即使它们已被覆盖。

有没有办法让代码覆盖率适用于inline函数?

2 个答案:

答案 0 :(得分:5)

当您编写inline函数时,编译器会将函数体内联到调用代码中。正如评论中所讨论的那样,它也不会为此内联正文发出调试信息(因此您无法进入该函数 - 我认为可以修复此问题 - 在fsbugs点向microsoft提交请求com)。

但是,编译器还会生成代码的动态版本 - 如果你写的话:

let inline add a b = a + b

然后在编译的代码中实际上有一个add方法。该方法将是通用的('a -> 'b -> 'c)并使用动态查找来查找+运算符的适当实现(因为.NET泛型不能表示此类约束)。

使用反射或引用时将调用动态实现:

open Microsoft.FSharp.Linq.RuntimeHelpers
<@ add 1 2 @> |> LeafExpressionConverter.EvaluateQuotation |> printfn "Got: %A"

如果你把断点放在add里并运行上面的代码,那么断点就会被击中(我假设代码覆盖率工具会报告这个函数)。

但请记住,当你在普通代码中编写add 1 2时,这不是实际执行的代码 - 这里执行的代码是一个不同的实现(使用慢动态查找) ,而不是内联)。

答案 1 :(得分:3)

内联函数是不是直接集成到调用代码中?如果是这样,则不会调用实际方法,因为代码是“内联的”,并且对于每个使用它们的位置,都存在内联代码的新副本。