像let Select=Seq.filter这样的语句是如何编译为CIL的



我想知道像这样的语句

 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命名风格。

相关内容

  • 没有找到相关文章

最新更新