Comment fonctionne F # inline?

Si je comprends bien, vous devez utiliser le mot-clé inline pour effectuer la spécialisation de type sur le site d’appel. C’est::

val inline (+) : ^a -> ^b -> ^c when (^a or ^b) : (static member (+) : ^a * ^b -> ^c) 

Contraint que ^a ou ^b doit avoir un membre statique tel que op_Addition , ou l’une des primitives intégrées, qui peut être utilisé pour combler le vide.

Donc, si vous avez une méthode qui a un + et que vous passez un int et un court comme paramètre, elle déballe + à une instruction pour utiliser la primitive intégrée pour int, et si vous passez dans un float et un octet, il utilise le float opcode addition primitive.

Comment cela se fait-il exactement au moment de la compilation? Comment pouvez-vous avoir une méthode dans le CLR qui permute quel opcode ou quelle méthode elle utilise en fonction du type?

Ce comportement est-il possible avec Reflection.Emit? Je comprends que l’inline est effectuée sur le site de l’appel. Cela signifie-t-il que le code ne fonctionne pas avec C #?

Comme suggéré par inline , le code est en ligne sur le site de l’appel. À chaque site d’appel, vous connaissez le paramètre de type concret ^T ; le code spécifique à ce type y est donc inséré.

Ceci est fait par le compilateur F #, vous ne pouvez pas le faire facilement dans un autre contexte (comme C # ou Ref.Emit).

La bibliothèque F # possède certaines fonctions en ligne qui peuvent encore être appelées par d’autres langages. Le runtime de ces implémentations effectue une répartition dynamic en fonction du type d’exécution, voir par exemple le code pour AdditionDynamic dans prim-types.fs dans le code de la bibliothèque F # Core pour obtenir une sensation.