如何将Select = Seq.filter编译为CIL?

时间:2013-11-18 21:01:58

标签: f# inline cil

我想知道如何发表声明

 let Select = Seq.filter

被编译成CIL:编译器是否内联对Seq.filter的调用? 有这种假设的迹象,因为编译器抱怨:

 let inline Select = Seq.filter
 error FS0832: Only functions may be marked 'inline'

1 个答案:

答案 0 :(得分:2)

我不认为你的推论是合乎逻辑的 - 编译器不会说,“你不能内联这个,因为它已经被内联了”,它说,“你只能内联一个(语法)函数”(那个是的,需要有句法参数,比如let inline select f = Seq.filter f)。

通常,这是一个实现细节,编译器是否内联定义,并且行为可能会根据您是在编译还是发布模式进行编译而改变(有些例外,例如可能有副作用的定义,必须不要内联以保留语义,例如let f = printfn "blah"; fun x -> x,其中"blah"只能打印一次)。如果你想看看F#编译器的特定版本是什么,只需使用ildasm来反汇编你编译的代码并查看。但是请记住,即使JIT引擎不在IL中内联,它们也可以内联,所以它可能都不重要。

此外,作为次要的风格注释,请记住模块中的值和函数通常绑定到camelCase标识符(所以select,而不是Select),而类型的成员遵循法线。 NET命名风格。