Разрешение конфликтов пространства имен.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, И так как этот модуль требует квалифицированного доступа (т.е. не может быть opened), компилятор выдает соответствующую ошибку.

Когда вы положите open Giraffe до open Elmish.Bridgeкомпилятор воспринимает это как модуль Giraffeне Elmish.Bridge.Giraffeпотому что последний еще не находится в области применения в этой точке. Глобальный модуль Giraffe можно открыть, чтобы не было ошибок.

Помимо изменения порядка open линий, вы можете обойти конфликт, явно указав, что вы имеете в виду "глобальный" модуль Giraffeне Elmish.Bridge.Giraffe, используя префикс global., нравится:

open Elmish.Bridge
open global.Giraffe
Другие вопросы по тегам