解决 .net 命名空间冲突



我正在使用长颈鹿并尝试集成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进行寻址。这正是打开模块时应该发生的情况:它的所有内容都变为"范围内"。

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

当出现此类命名冲突时,F# 会优先选择最近打开的模块中的名称。因此,当你写open Giraffe时,编译器认为它意味着open Elmish.Bridge.Giraffe。由于该模块需要限定访问(即无法open编辑),编译器会发出相关错误。

当你把open Giraffe放在open Elmish.Bridge之前时,编译器认为它的意思是模块Giraffe,而不是Elmish.Bridge.Giraffe,因为后者在这一点上还没有在范围内。全局模块Giraffe可以打开,因此不会出错。

除了更改open行的顺序之外,您还可以通过使用前缀global.显式指定您指的是"全局"模块Giraffe而不是Elmish.Bridge.Giraffe来解决冲突,如下所示:

open Elmish.Bridge
open global.Giraffe

最新更新