据我了解,使用 F# 中的 inline 关键字可以在调用站点执行类型特化。也就是说:
val inline (+) : ^a -> ^b -> ^c
when (^a or ^b) : (static member (+) : ^a * ^b -> ^c)
约束条件是 ^a
或者 ^b
必须有一个像 op_Addition
这样的静态成员或内置原语,可以用来填补这个空缺。
所以如果你有一个方法有一个 +,你传递一个 int 和一个 short 作为参数它就会展开 + 到一个指令来使用内置的 int 原语,如果你传递一个 float 和一个 byte 它就会使用 float 的原语加法操作码。
这个在编译时具体是如何完成的?你怎么能有一个在 CLR 中的方法可以根据类型切换使用哪种操作码或方法?
Reflection.Emit 是否支持此行为?我了解到内联是在调用站点执行的,这是否意味着代码不能在 C# 中工作?
+
运算符的位置在 C:\Program Files (x86)\FSharp-2.0.0.0\source\fsharp\FSharp.Core\prim-types.fs 的第 3527 行,它会在编译时切换参数类型并直接发出 IL 代码。 - Juliet