Visual Studio 2012 中的代码覆盖率工具标记所有 inline
即使它们被覆盖,功能也不会被覆盖。
有什么方法可以使代码覆盖率适用于 inline
职能?
最佳答案
当你写一个 inline
函数,编译器将函数体内联到调用代码中。正如评论中所讨论的,它也不会发出此内联正文的调试信息(因此您无法进入该函数 - 我认为这可以解决 - 在 fsbugs
向 microsoft
提交请求 | dot 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
时实际执行的代码。在普通代码中 - 此处执行的代码是不同的实现(使用慢速动态查找,而不是内联)。
关于visual-studio-2012 - 在 Visual Studio 2012 中使用 F# 的内联函数的代码覆盖率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15166772/