4

問題が発生しました: インライン関数からプライベートまたは内部値にアクセスしようとすると、「値 'xxx' はインラインでマークされましたが、その実装では十分でない内部またはプライベート関数が使用されています」というエラーが表示されます。アクセス可能」。論理的ではありますが、誰かが良い回避策を持っているのではないかと思います。私が考えることができる最善の方法は、ネストされたモジュールに値を公開して、誰も突っ込まないことを願うことです (これらの値は不変なので、とにかく心配していません)。リフレクションはオプションだと思いますが、(プライベートデリゲートを使用して) 呼び出しをキャッシュできないと、パフォーマンスへの影響が大きすぎます。

4

1 に答える 1

3

短い答え: いいえ、値は呼び出しサイトにインラインで挿入されるため、プライベートな値を使用できず、それを回避する実際の方法はありません。

より長い答え: 非常に醜いコードを書くことを気にせず、使用ごとにいくつかのメソッド呼び出しのオーバーヘッドを処理できる場合、1 つの代替手段は、動的な実装 (OperatorIntrinsics.AbsDynamicTableImplコア ライブラリなど) を作成することです。これは非公開にすることができます。次に、動的実装を public opaque ジェネリック メソッド (例: 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 に答える