Con F # entiendo que puede usar la palabra clave en línea para realizar una especialización de tipo en el sitio de llamadas. Es decir ::¿Cómo funciona F # inline?
val inline (+) : ^a -> ^b -> ^c
when (^a or ^b) : (static member (+) : ^a * ^b -> ^c)
Restringe que ^a
o ^b
debe tener un miembro estático como op_Addition
, o uno de los incorporados en las primitivas, que se puede utilizar para rellenar el hueco.
Así que si tienes un método que tiene un + y pasas un int y un short como parámetros, desenvuelve + en una instrucción para usar la primitiva incorporada para int, y si pasas en un flotante y un byte utiliza el código de operación de suma primitiva flotante.
¿Cómo se hace esto exactamente en tiempo de compilación? ¿Cómo se puede tener un método en el CLR que cambie qué código de operación o método utiliza en función del tipo?
¿Es posible este comportamiento con Reflection.Emit? Entiendo que la alineación se realiza en el sitio de llamada, ¿eso significa que el código no funciona con C#?
No sé mucho sobre las partes internas, pero parece que el código fuente F # define el operador '+' (C: \ Archivos de programa (x86) \ FSharp-2.0.0.0 \ source \ fsharp \ FSharp .Core \ prim-types.fs línea 3527) activa los tipos de argumento en el tipo de compilación y emite código IL directamente. – Juliet