RequireQualifiedAccess

RequireQualifiedAccess

我在使用RequireQualifiedAccess时遇到了麻烦:尽管具有该属性,但联合用例遮盖了类型。奇怪的是,仅当我在封闭模块上而不是在内部模块上使用合格的访问权限时,或者如果我打开它,才会出现该错误:

module Module =
    type [<RequireQualifiedAccess>] Du =
        | SomeCase

    type [<RequireQualifiedAccess>] SuperDu =
        | Du of Du

    let valid = Du.SomeCase // Valid, as expected

let invalid = Module.Du.SomeCase // Not defined?!?

open Module
let validToo = Du.SomeCase // Wait, this is valid again?

在无效行中,首先有一个警告,即不建议使用没有合格访问权限的.Du,就像我在指SuperDu.Du一样,然后给出一个错误,即未定义SomeCase

我一直认为,使用open X等同于将X.前缀到该模块的所有定义之前。但这显然不是...?

这里发生了什么?尽管有RequireQualifiedAccess,我是否必须避免这种名称冲突?这是编译器错误吗?

最佳答案

这是F#编译器中的一个问题,已经有报道。有关更多信息,请参见:

  • [<RequireQualifiedAccess>] on a DU shadows types in the same module
  • Type inference for a record/class behaves differently when module is open or not
  • 10-06 06:54