我想知道如何发表声明
let Select = Seq.filter
被编译成CIL:编译器是否内联对Seq.filter的调用? 有这种假设的迹象,因为编译器抱怨:
let inline Select = Seq.filter
error FS0832: Only functions may be marked 'inline'
答案 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命名风格。