解决.net名称空间冲突

sas*_*ang 3 .net f# elmish

我正在使用长颈鹿,并试图整合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
Run Code Online (Sandbox Code Playgroud)

但是如果我调换订单,错误就会消失。

open Giraffe
open Elmish.Bridge
Run Code Online (Sandbox Code Playgroud)

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

Fyo*_*kin 6

这是命名冲突。

在您使用时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,还可以通过使用prefix 显式指定您的意思是“ global”模块Giraffe(而不是Elmish.Bridge.Giraffe)来解决冲突global.,如下所示:

open Elmish.Bridge
open global.Giraffe
Run Code Online (Sandbox Code Playgroud)