为何标注inline的成员代码会抛出FS1113错误(使用内部/私有成员)?
F# 内联成员编译差异问题解析
问题现象
以下代码编译时会抛出错误:
type SomeType(x) = member inline _.Value = x
对应的错误提示:
member inline _.Value = x--------------------^^^^^
/home/user/stdin(2,21): error FS1113: The value 'Value' was marked inline but its implementation makes use of an internal or private function which is not sufficiently accessible
但将成员的self参数从_改为命名参数x后,代码却能正常编译:
type SomeType(x) = member inline x.Value = x
请问导致这种编译结果差异的原因是什么?
原因解析
这是F#编译器处理内联成员时的细节逻辑差异:
- 使用
_作为self参数时,编译器会把右侧的x解析为类的私有字段(也就是构造函数传入的那个x)。而内联成员要求所有被引用的实体都必须具备可内联的访问权限,私有字段不符合这个要求,因此触发FS1113错误。 - 使用命名的self参数(这里是
x)时,右侧的x会被编译器解析为当前实例的self参数,而非构造函数传入的私有字段。此时内联成员的实现仅依赖公开可见的self参数,不存在访问权限的问题,因此可以顺利编译。
本质上两种写法里的x指向的对象完全不同:前者指向私有内部字段,后者指向实例本身,这直接导致了编译器对内联合法性的判断结果不同。
内容的提问来源于stack exchange,提问作者capitalistcuttle
相关产品推荐
相关产品推荐

