7

Visual Studio 2012 中的代码覆盖工具将所有inline函数标记为未覆盖,即使它们已被覆盖。

有什么方法可以使代码覆盖对inline函数起作用?

4

2 回答 2

5

编写inline函数时,编译器会将函数体内联到调用代码中。正如评论中所讨论的,它也不会为此内联主体发出调试信息(因此您无法进入该功能 - 我认为这可以修复 - 向fsbugsat microsoftdot提交请求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的代码——这里执行的代码是不同的实现(使用慢速动态查找,而不是内联)。

于 2013-03-12T14:32:36.903 回答
3

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

于 2013-03-03T21:47:40.263 回答