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