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?
Istnieje kilka błędów związanych z tym - https://github.com/Microsoft/visualfsharp/issues/1253 i https://github.com/Microsoft/visualfsharp/issues/95 –
@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
Świetne - dodane z linkami do problemów (myślę, że wspomniałeś o # 1294 zamiast # 1293) –