【发布时间】:2011-05-23 17:39:20
【问题描述】:
据我了解,使用 F#,您可以使用 inline 关键字在调用站点执行类型特化。那就是::
val inline (+) : ^a -> ^b -> ^c
when (^a or ^b) : (static member (+) : ^a * ^b -> ^c)
限制^a 或^b 必须具有像op_Addition 这样的静态成员,或者是内置原语之一,可用于填补空白。
因此,如果您有一个带有 + 的方法,并且传入一个 int 和一个 short 作为参数,它会将 + 解包到一条指令以使用 int 的内置原语,如果您传入一个 float 和一个字节,它使用浮点原语加法操作码。
这是如何在编译时完成的?如何在 CLR 中有一个方法来根据类型切换它使用的操作码或方法?
Reflection.Emit 可以实现这种行为吗? 我知道内联是在调用站点执行的,这是否意味着代码不适用于 C#?
【问题讨论】:
-
我对内部的了解并不多,但它看起来像定义
+运算符的F#源代码(C:\Program Files (x86)\FSharp-2.0.0.0\ source\fsharp\FSharp.Core\prim-types.fs 第 3527 行)在编译类型时打开参数类型并直接发出 IL 代码。