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

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

1 Ответ

2 голосов
/ 28 января 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...