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

Old*_*vec 7 f# code-coverage inline visual-studio-2012

Visual Studio 2012中的代码覆盖工具将所有inline功能标记为未覆盖,即使它们被覆盖.

有什么方法可以使代码覆盖inline功能适用于函数吗?

Tom*_*cek 5

编写inline函数时,编译器将函数的主体内联到调用代码中。正如在评论中讨论的那样,它也不会为这个内嵌体EMIT调试信息(所以你不能踏入的功能-我认为这可能是固定的-提交请求fsbugsmicrosoftcom)。

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

let inline add a b = a + b
Run Code Online (Sandbox Code Playgroud)

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

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

open Microsoft.FSharp.Linq.RuntimeHelpers
<@ add 1 2 @> |> LeafExpressionConverter.EvaluateQuotation |> printfn "Got: %A"
Run Code Online (Sandbox Code Playgroud)

如果将断点放入其中add并运行上面的代码,则断点将被击中(并且我认为代码覆盖率工具将报告该函数所涉及的内容)。

但是请记住,这不是您用add 1 2普通代码编写时实际执行的代码-此处执行的代码是不同的实现(使用慢速动态查找,而不是内联)。


Sha*_*lde 3

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