Почему RequireQualifiedAccess не работает, что приводит к ошибке компиляции, но не в том случае, если я использую open?


У меня возникли проблемы с 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? Это ошибка компилятора?

1 7
f#

1 ответ:

Это проблема в компиляторе F#, о которой уже сообщалось. Для получения дополнительной информации см.: