Есть ли хороший способ для встроенной функции получить доступ к частным или внутренним значениям?

Я только что столкнулся с проблемой: когда я пытаюсь получить доступ к закрытому или внутреннему значению из встроенной функции, я получаю сообщение об ошибке "Значение" xxx "было помечено как встроенное, но его реализация использует внутреннюю или частную функцию, которая недостаточно доступным". Хотя логично, мне интересно, есть ли у кого-нибудь хорошая работа. Лучшее, что я могу сделать, это разместить значения публично во вложенном модуле и просто надеяться, что никто не будет копаться (что меня не очень беспокоит, так как эти значения неизменны). Я полагаю, что рефлексия - это вариант, но без возможности кеширования вызовов (с использованием... частных делегатов) производительность слишком велика.

1 ответ

Решение

Краткий ответ: нет, так как значение будет вставлено в строку вызова, он не может использовать личные значения, и нет реального способа обойти это.

Более длинный ответ: если вы не против написания невероятно уродливого кода и можете справиться с накладными расходами нескольких вызовов методов за использование, одной из альтернатив будет создание динамической реализации (например, OperatorIntrinsics.AbsDynamicTableImpl в основной библиотеке), которая может быть приватной. Затем вы можете обернуть динамическую реализацию в общедоступный непрозрачный универсальный метод (например, OperatorIntrinsics.AbsDynamic<'T>), а затем создайте встроенное значение, которое добавляет надлежащие ограничения типа и откладывает динамическую реализацию (например, let inline abs< ^t when ^t : (static member Abs : ^t -> ^t)> x = AbsDynamic x). Теперь, когда вы в строке abs вы просто видите вызов AbsDynamic но ни одна из дальнейших деталей реализации. В большинстве случаев я ожидаю, что это будет гораздо худшее решение, чем просто сделать вашу ценность публичной, а не частной.

Другие вопросы по тегам