解决 .net 命名空间冲突

Resolving .net namespace conflicts

我正在使用 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

有人可以解释为什么会发生这种情况以及如何最好地解决它吗?

这是命名冲突。

当您 open Elmish.Bridge 时,这会将模块 Elmish.Bridge.Giraffe 纳入范围,并且它可以通过名称 Giraffe 寻址。这正是您打开模块时应该发生的情况:其所有内容变为 "in scope".

问题是这与来自不同库的另一个名为 Giraffe 的模块冲突。

当出现此类命名冲突时,F# 会优先使用最近打开的模块中的名称。因此,当您写 open Giraffe 时,编译器将其理解为 open Elmish.Bridge.Giraffe。由于该模块需要合格的访问权限(即不能 opened),编译器会发出相关错误。

当你把 open Giraffe 放在 open Elmish.Bridge 之前时,编译器认为它是指模块 Giraffe,而不是 Elmish.Bridge.Giraffe ,因为后者当时还不在范围内。全局模块Giraffe可以打开,所以不会报错

除了更改 open 行的顺序外,您还可以通过明确指定您指的是 "global" 模块 Giraffe 而不是 Elmish.Bridge.Giraffe 来解决冲突使用前缀 global.,像这样:

open Elmish.Bridge
open global.Giraffe