为何F#的let绑定会生成internal字段而非private readonly字段?
F#类编译后字段修饰符疑问
F#原始代码
type Foo(bar: int) = let _bar = bar member this.Do() = _bar
编译生成的C#等效代码
[Serializable] [CompilationMapping(SourceConstructFlags.ObjectType)] public class Foo { internal int _bar; public Foo(int bar) { _bar = bar; } public int Do() { return _bar; } }
疑问:为何生成的字段是internal而非private readonly?
原因解析
internal修饰符的由来:F#编译器设计时,允许同一编译单元(同一程序集)内的其他F#代码访问类中的let绑定字段,以此支持F#特有的语言特性(比如内联函数优化、模块间的隐式访问等)。将字段设为internal而非private,是为了让编译器在处理同程序集内的F#代码时,能更灵活地进行优化和类型检查,同时对外(其他程序集)保持封装性。- 为何不是
readonly:F#中的let绑定在类构造函数内的值,其不可变性是由F#编译器在语言层面强制约束的——在F#代码中尝试修改这类值会直接触发编译错误。但CLR的readonly修饰符是运行时层面的约束,F#并没有依赖它来实现不可变性,因此编译后的字段不会标记为readonly。
内容的提问来源于stack exchange,提问作者Pavel Voronin
相关产品推荐
相关产品推荐

