С F # я понимаю, что вы можете использовать ключевое слово inline для выполнения специализации типов на сайте вызова. Это::
val inline (+) : ^a -> ^b -> ^c
when (^a or ^b) : (static member (+) : ^a * ^b -> ^c)
Ограничения, которые ^a
или ^b
должны иметь статический член типа op_Addition
или один из встроенных примитивов, который может быть использован для заполнения пробела.
Итак, если у вас есть метод, который имеет +, и вы передаете int и короткие как параметры, он распаковывает + в команду для использования встроенного примитива для int, и если вы передаете поплавок и байт, использует код операции добавления примитива с поплавком.
Как именно это делается во время компиляции? Как вы можете использовать метод в среде CLR, который переключает какой код операции или метод, который он использует на основе типа?
Возможно ли такое поведение с Reflection.Emit? Я понимаю, что inlining выполняется на сайте call-сайта, означает ли это, что код не работает с С#?