Разрешение конфликтов пространства имен.net
Я использую Giraffe и пытаюсь интегрировать Elmish.Bridge. Я получаю следующую ошибку:
error FS0892: This declaration opens the module 'Elmish.Bridge.Giraffe', which is marked as 'RequireQualifiedAccess'. Adjust your code to use qualified references to the elements of the module instead, e.g. 'List.map' instead of 'map'. This change will ensure that your code is robust as new constructs are added to libraries.
если я открою модули в следующем порядке:
open Elmish.Bridge
open Giraffe
но если я поменяю порядок, то ошибка исчезнет.
open Giraffe
open Elmish.Bridge
Может кто-нибудь объяснить, почему это происходит и как лучше это решить?
1 ответ
Это конфликт имен.
Когда ты open Elmish.Bridge
это приводит в действие модуль Elmish.Bridge.Giraffe
и он становится адресуемым по имени Giraffe
, Это именно то, что должно произойти, когда вы открываете модуль: весь его контент становится "в области видимости".
Проблема в том, что это конфликтует с другим модулем по имени Giraffe
из другой библиотеки.
Когда возникает такой конфликт имен, F# отдает предпочтение именам из самых последних открытых модулей. Поэтому, когда вы пишете open Giraffe
компилятор понимает это как open Elmish.Bridge.Giraffe
, И так как этот модуль требует квалифицированного доступа (т.е. не может быть open
ed), компилятор выдает соответствующую ошибку.
Когда вы положите open Giraffe
до open Elmish.Bridge
компилятор воспринимает это как модуль Giraffe
не Elmish.Bridge.Giraffe
потому что последний еще не находится в области применения в этой точке. Глобальный модуль Giraffe
можно открыть, чтобы не было ошибок.
Помимо изменения порядка open
линий, вы можете обойти конфликт, явно указав, что вы имеете в виду "глобальный" модуль Giraffe
не Elmish.Bridge.Giraffe
, используя префикс global.
, нравится:
open Elmish.Bridge
open global.Giraffe