我遇到了一个问题:当我尝试从内联函数访问私有或内部值时,我得到错误“值'xxx'被标记为内联,但它的实现使用了内部或私有函数,是不是很容易获得“。虽然合乎逻辑,我想知道是否有人有一个好的工作。我能想到的最好的事情就是将值公开放在一个嵌套的模块中,只希望没有人去探索(无论如何我都不会太担心,因为这些值是不可变的)。我认为反射是一种选择,但是没有能够缓存调用(使用......私有代理),性能损失太大了。
答案 0 :(得分:2)
简短回答:不,因为该值将内嵌到调用站点中,所以它不能使用私有值,也没有真正的解决方法。
更长的答案:如果你不介意编写令人难以置信的丑陋代码并且你可以处理每次使用的几个方法调用的开销,一种替代方法是创建一个动态实现(例如核心库中的OperatorIntrinsics.AbsDynamicTableImpl
),可以是私人的。然后,您可以将动态实现包装在公共不透明泛型方法(例如OperatorIntrinsics.AbsDynamic<'T>
)中,然后创建一个内联值,该值可以添加适当的类型约束并遵循动态实现(例如let inline abs< ^t when ^t : (static member Abs : ^t -> ^t)> x = AbsDynamic x
)。现在,当您内联abs
时,您只会看到对AbsDynamic
的调用,但没有进一步的实施细节。在大多数情况下,我认为这是一个更糟糕的解决方案,而不仅仅是让你的价值公开而不是私人。