Ответ 1
В общем случае функции, объявленные как inline
, не будут использоваться (или не будут работать так же, как и у F #) с других языков. Они заменяются на сайте вызова как функция компилятора F #, который не поддерживается С# и другими языками CLR. Это значительное преимущество F # над этими другими языками.
Однако есть некоторые исключения. Можно написать встроенные функции F #, которые выполняют диспетчеризацию на основе типа времени выполнения, который затем можно использовать с С# и другими языками. Как правило, они не получат тот же ИЛ, если они используются с С#, как и у F # для определенных типов (конкретные обработчики для примитивных типов не будут обрабатываться). Вот почему (+)
работает - вы можете видеть это в коде для оператора, где (+)
вызывает AdditionDynamic<(^T),(^U),(^V)> x y
. Обратите внимание, что (-)
отсутствует версия отправленной версии и явно помечена как [<NoDynamicInvocation>]
, поэтому он не работает с С#.
Это фактически то же ограничение в С#, которое заставляло людей запрашивать такие вещи, как IArithmetic (* используя интернет-архив, так как это было скрытый в Connect) в течение многих лет. F # работает вокруг этого через статически разрешенные параметры типа, но это функция, специфичная для F #, и не будет работать с С# и другими языками. Обертка функции через F # не включает ее в С#.