Это конфликт имен.
Когда вы 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