4

我刚刚遇到了一个问题:当我尝试从内联函数访问私有或内部值时,我收到错误“值'xxx'被标记为内联,但它的实现使用了一个不够充分的内部或私有函数无障碍”。虽然合乎逻辑,但我想知道是否有人有很好的解决方法。我能想到的最好的事情就是将这些值公开放在一个嵌套模块中,并希望没有人四处闲逛(无论如何我都不太担心,因为这些值是不可变的)。我想反射是一种选择,但是如果不能缓存调用(使用...私有委托),性能损失太大了。

4

1 回答 1

3

简短的回答:不,由于该值将内联插入到调用站点中,因此它不能使用私有值,并且没有真正的解决方法。

更长的答案:如果您不介意编写非常丑陋的代码并且您可以处理每次使用的几个方法调用的开销,那么一种选择是创建一个动态实现(例如OperatorIntrinsics.AbsDynamicTableImpl在核心库中),它可以是私有的。然后,您可以将动态实现包装在公共不透明的泛型方法(例如OperatorIntrinsics.AbsDynamic<'T>)中,然后创建一个内联值,该值添加适当的类型约束并推迟到动态实现(例如let inline abs< ^t when ^t : (static member Abs : ^t -> ^t)> x = AbsDynamic x)。现在,当您内联时,abs您只会看到一个调用,AbsDynamic但没有看到进一步的实现细节。在大多数情况下,我希望这是一个比仅仅将您的价值公开而不是私有的更糟糕的解决方案。

于 2011-01-28T16:20:19.290 回答