F#内联如何工作?

使用F#,我的理解是,您可以使用inline关键字在呼叫站点执行类型特化。 那是::

val inline (+) : ^a -> ^b -> ^c
      when (^a or ^b) : (static member (+) : ^a * ^b -> ^c)

约束^a^b必须具有类似于op_Addition的静态成员,或者可以用于填充空隙的内置基元之一。

所以,如果你有一个方法有一个+,并且你传入一个int和一个short作为参数,它就展开+到一个指令,以便为int使用内置原语,如果你传入一个float和一个字节,它将使用float原语加法操作码。

这在编译时究竟是如何完成的? 你怎么能在CLR中有一个方法根据类型切换它使用的操作码或方法?

Reflection.Emit可以实现这种行为吗? 我知道内联是在调用站点执行的,这是否意味着代码不适用于C#?


inline ,代码在呼叫站点内联。 在每个调用站点,您都知道具体的类型参数^T ,因此该类型的特定代码被插入到那里。

这是由F#编译器完成的,您不能在其他上下文中轻松完成它(如C#或Ref.Emit)。

F#库有一些内联函数,仍然可以被其他语言调用,这些实现的运行时基于运行时类型进行动态分派,请参阅例如F#Core库代码中prim-types.fs中的AdditionDynamic代码以获取一种感觉。

链接地址: http://www.djcxy.com/p/14155.html

上一篇: How does F# inline work?

下一篇: What can you do in MSIL that you cannot do in C# or VB.NET?