Z F # rozumiem, że można użyć wbudowanego słowa kluczowego, aby wykonać specjalizację typu na stronie połączenia. Czyli ::Jak działa F # inline?
val inline (+) : ^a -> ^b -> ^c
when (^a or ^b) : (static member (+) : ^a * ^b -> ^c)
Ogranicza że ^a
lub ^b
musi mieć element statyczny jak op_Addition
lub jednego z wbudowanych w prymitywów, które mogą być wykorzystane do wypełnienia luki.
Więc jeśli masz metodę, która ma + i przekazujesz w int i short jako parametry, odwija + do instrukcji użycia wbudowanego prymitywu dla int, i jeśli przekazujesz float i bajt używa podstawowego kodu źródłowego operacji float.
Jak dokładnie to robi się podczas kompilacji? W jaki sposób można mieć metodę w CLR, który przełącza, jakiego kodu lub metody używa na podstawie typu?
Czy to zachowanie jest możliwe w Reflection.Emit? Rozumiem, że wpisywanie jest wykonywane w witrynie wywołania, czy to oznacza, że kod nie działa z C#?
Nie wiem zbyt wiele o wewnętrznych, ale wygląda na to, że kod źródłowy F # definiuje operatora '+' (C: \ Program Files (x86) \ FSharp-2.0.0.0 \ source \ fsharp \ FSharp .Core \ prim-types.fs wiersz 3527) przełącza typy argumentów w typie kompilacji i bezpośrednio wysyła kod IL. – Juliet