Visual Studio 2012中的代码覆盖率工具将所有inline
函数标记为未覆盖,即使它们已被覆盖。
有没有办法让代码覆盖率适用于inline
函数?
答案 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)
内联函数是不是直接集成到调用代码中?如果是这样,则不会调用实际方法,因为代码是“内联的”,并且对于每个使用它们的位置,都存在内联代码的新副本。