Azure 和 Microsoft.Azure 命名空间之间的冲突

问题描述 投票:0回答:2

我需要为我的代码添加新的引用,因此我通过 nuget 包管理器添加了

Azure.Messaging.ServiceBus
。安装成功完成,我可以在我的包的参考中看到这一点。

但是,当我尝试使用

Azure.Messaging.ServiceBus
添加到给定文件时,据我所知,它找不到它,因为还有其他对
Microsoft.Azure.X
的引用,并且 Azure 命名空间被路由到
Microsoft.Azure
命名空间。

我能够通过以下方式在命名空间之外添加引用来暂时避免该问题:

#pragma warning disable SA1200 // Using directives must be placed correctly
//using Azure.Messaging.ServiceBus;
#pragma warning restore SA1200 // Using directives must be placed correctly

namespace X.Y.Z
{
    using System;
    ...
    using Microsoft.Azure.ResourceProvider.Common.Exceptions;
    ...

但是,这有点痛苦,因为我必须将其添加到许多类中,而且它还阻止我做一些事情,例如使用

Azure.Messaging.ServiceBus.ServiceBusMessage
的完全限定对象名称,以免与已命名的另一个类冲突
 ServiceBusMessage
在我的解决方案中。

我可以做些什么来让

Azure.Messaging.ServiceBus
像任何其他导入一样对待,并且不与现有引用发生冲突?

c# azure .net-core azureservicebus
2个回答
0
投票
  • Using
    语句是为了帮助可读性,而不是真正为了性能。

假设标题部分(

using
语句部分)中的 using 指令类型是将名称空间带入范围,其中作为完全限定的名称空间(例如:
System.Text.StringBuilder
) - 这种语句用于正确使用(创建并处置)实现 IDisposable 接口的对象。

  • <fully-qualifed-type-name>
    是类型的名称,可以在不指定类型名称的情况下引用其静态成员和嵌套类型。如果您不提供完全限定的类型名称,C# 会生成编译器错误 CS0246,如此 MSFT Doc 中引用的那样。

正如 Panagiotis Kanavos 所建议的那样,另一种选择是使用两个或多个文件来分隔需要访问每个命名空间的类/方法。

很高兴 Nimish Todi,你正在努力,

  • 通过重构代码来解决问题,使类只执行自己的功能,而不是在此时进行大量更改,而导入的别名确实有帮助。

0
投票

可以通过使用 'global' 关键字导入命名空间来解决该问题,如下所示:

namespace X.Y.Z
{
    using System;
    ...
    using Microsoft.Azure.ResourceProvider.Common.Exceptions;    
    using global::Azure.Messaging.ServiceBus;
    ...

每当您在命名空间块内使用“

using Azure.Messaging.ServiceBus
”语句时,编译器都会尝试按以下顺序查找是否存在任何匹配的命名空间序列:

 1. X.Y.Z.Azure
 2. X.Y.Azure
 3. X.Azure
 4. Azure

如果它在上述任何一个中找到匹配的命名空间,它将停止进一步处理。

在您的情况下,编译器已在上述场景 1、2 或 3 中找到匹配项。假设它找到的匹配项是

X.Azure
。此后,它将尝试搜索
X.Azure.Messaging.ServiceBus
而不是
Azure.Messaging.ServiceBus
- 但未能找到。

使用 global 关键字,如上所示,告诉编译器直接考虑命名空间

Azure.Messaging.ServiceBus
,而不是尝试上面提到的序列匹配。

© www.soinside.com 2019 - 2024. All rights reserved.