2016-08-22 12 views
7

Mam problem z RequireQualifiedAccess: pomimo atrybutu, sprawa związku jest shadowing typu. O dziwo, błąd pojawia się tylko wtedy, gdy używam wykwalifikowanym dostęp na module otaczającej, a nie wewnątrz niego lub jeśli otworzę go:Dlaczego RequireQualifiedAccess nie działa, co prowadzi do błędu kompilacji, ale nie, jeśli używam open?

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? 

W nieprawidłową linię, jest pierwszym ostrzeżeniem, że za pomocą .Du bez kwalifikowanego dostępu jest przestarzała, tak jakbym miał na myśli SuperDu.Du, to daje błąd, że SomeCase nie jest zdefiniowany.

Zawsze uważałem, że używanie open X jest równoznaczne z przedrostkiem X. dla wszystkich definicji pobranych z tego modułu. Ale to oczywiście nie jest ...?

Co się tutaj dzieje? Czy muszę unikać tego rodzaju kolizji nazwy, mimo że RequireQualifiedAccess? Czy jest to błąd kompilatora?

+4

Istnieje kilka błędów związanych z tym - https://github.com/Microsoft/visualfsharp/issues/1253 i https://github.com/Microsoft/visualfsharp/issues/95 –

+0

@TomasPetricek Aha! Problemy nr 1253 i 1293 opisują dokładnie punkty w tym pytaniu i oba zostały oznaczone jako błąd przez Dona Syme. To odpowiada na moje pytanie. Czy możesz to zrobić, więc mogę to zaakceptować? – Vandroiy

+1

Świetne - dodane z linkami do problemów (myślę, że wspomniałeś o # 1294 zamiast # 1293) –

Odpowiedz

Powiązane problemy