Avec F #, je crois comprendre que vous pouvez utiliser le mot-clé inline pour effectuer une spécialisation de type sur le site d'appel. C'est ::Comment fonctionne F # en ligne?
val inline (+) : ^a -> ^b -> ^c
when (^a or ^b) : (static member (+) : ^a * ^b -> ^c)
que ^a
ou Contraint ^b
doit avoir un membre statique comme op_Addition
, ou l'un des construit en primitives, 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ètres, elle déballe + d'une instruction pour utiliser la primitive intégrée pour int, et si vous passez un float et un octet il utilise l'opcode d'ajout de primitive float.
Comment cela se fait-il exactement au moment de la compilation? Comment pouvez-vous avoir une méthode dans le CLR qui permute l'opcode ou la méthode qu'il utilise en fonction du type?
Est-ce que ce comportement est possible avec Reflection.Emit? Je comprends que l'inline est effectuée sur le site d'appel, est-ce que cela signifie que le code ne fonctionne pas avec C#?
Je ne sais pas vraiment beaucoup sur les internes, mais il ressemble au code source F # définissant l'opérateur '+' (C: \ Program Files (x86) \ FSharp-2.0.0.0 \ source \ fsharp \ FSharp .Core \ prim-types.fs ligne 3527) commute les types d'arguments au type de compilation et émet directement le code IL. – Juliet