Visual Studio 2012 中的代码覆盖工具将所有inline
函数标记为未覆盖,即使它们已被覆盖。
有什么方法可以使代码覆盖对inline
函数起作用?
Visual Studio 2012 中的代码覆盖工具将所有inline
函数标记为未覆盖,即使它们已被覆盖。
有什么方法可以使代码覆盖对inline
函数起作用?
编写inline
函数时,编译器会将函数体内联到调用代码中。正如评论中所讨论的,它也不会为此内联主体发出调试信息(因此您无法进入该功能 - 我认为这可以修复 - 向fsbugs
at 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
的代码——这里执行的代码是不同的实现(使用慢速动态查找,而不是内联)。
内联函数不是直接集成到调用代码中的吗?如果是这样,则不会调用实际方法,因为代码是“内联”的,并且对于每个使用它们的地方,都存在内联代码的新副本。