Разрешение конфликтов пространства имен .net - PullRequest
3 голосов
/ 16 июня 2019

Я использую 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 Ответ

6 голосов
/ 16 июня 2019

Это конфликт имен.

Когда вы 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
...