¿Hay alguna buena manera para que una función en línea acceda a valores privados o internos?

StackOverflow https://stackoverflow.com/questions/4824536

  •  26-10-2019
  •  | 
  •  

Pregunta

Acabo de encontrarme con un problema: cuando intento acceder a un valor privado o interno de una función en línea, obtengo el error "El valor 'xxx' fue marcado en línea pero su implementación utiliza una función interna o privada que no es lo suficientemente accesible". Aunque lógico, me pregunto si alguien tiene un buen trabajo. Lo mejor que puedo pensar es colocar los valores públicamente en un módulo anidado y solo espero que nadie se hagas de alguna manera (lo que no me preocupa demasiado de todos modos, ya que estos valores son inmutables). Supongo que la reflexión es una opción, pero sin ser capaces de caché (usar ... delegados privados), el éxito de rendimiento es demasiado.

¿Fue útil?

Solución

Respuesta corta: No, dado que el valor se insertará en línea en el sitio de llamadas, no puede usar valores privados y no hay una forma real de trabajar en su alrededor.

Respuesta más larga: si no le importa escribir un código increíblemente feo y puede manejar la sobrecarga de algunas llamadas de método por uso, una alternativa sería crear una implementación dinámica (por ejemplo, OperatorIntrinsics.AbsDynamicTableImpl en la biblioteca central), que puede ser privado. Luego puede envolver la implementación dinámica en un método genérico opaco público (por ejemplo, OperatorIntrinsics.AbsDynamic<'T>), y luego cree un valor en línea que agrega las restricciones de tipo adecuadas y defiende a la implementación dinámica (por ejemplo, let inline abs< ^t when ^t : (static member Abs : ^t -> ^t)> x = AbsDynamic x). Ahora cuando estás en línea abs Solo ves una llamada a AbsDynamic Pero ninguno de los detalles de implementación adicionales. En la mayoría de los casos, esperaría que esta sea una solución mucho peor que simplemente hacer que su valor sea público en lugar de privado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top