我想知道像这样的语句
let Select = Seq.filter
被编译成CIL:编译器是否内联了对Seq.filter的调用?这一假设有一个迹象,因为编译器抱怨道:
let inline Select = Seq.filter
error FS0832: Only functions may be marked 'inline'
我不认为你的推理是合乎逻辑的——编译器并不是说"你不能内联这个,因为它已经在内联了",而是说"你只能内联一个(语法)函数"(也就是说,需要有语法参数,比如let inline select f = Seq.filter f
)。
通常,编译器是否内联定义是一个实现细节,行为可能会根据您是在调试模式还是发布模式下编译而变化(也有例外,例如可能产生副作用的定义,为了保留语义,这些定义不能内联,例如let f = printfn "blah"; fun x -> x
,其中"blah"
必须只打印一次)。如果您想了解F#编译器的特定版本的功能,只需使用ildasm来反汇编已编译的代码并查看即可。但也要记住,JIT引擎可能会内联东西,即使它们在IL中不是内联的,所以这两种方式都可能不重要。
此外,作为一个次要的风格注意事项,请记住模块中的值和函数通常绑定到camelBase标识符(因此是select
,而不是Select
),而类型的成员遵循正常的.NET命名风格。