Old*_*vec 7 f# code-coverage inline visual-studio-2012
Visual Studio 2012中的代码覆盖工具将所有inline功能标记为未覆盖,即使它们被覆盖.
有什么方法可以使代码覆盖inline功能适用于函数吗?
编写inline函数时,编译器将函数的主体内联到调用代码中。正如在评论中讨论的那样,它也不会为这个内嵌体EMIT调试信息(所以你不能踏入的功能-我认为这可能是固定的-提交请求fsbugs的microsoft点com)。
但是,编译器还会生成代码的动态版本-如果您编写以下代码:
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普通代码编写时实际执行的代码-此处执行的代码是不同的实现(使用慢速动态查找,而不是内联)。
| 归档时间: |
|
| 查看次数: |
508 次 |
| 最近记录: |