C#类命名空间隐藏了引用的命名空间

14

我有这样一个类:

namespace Token1.Token2.Token3
{
    public class Class1
    {
    }
}

还有另一个类似于这样的类:

namespace Token2.Token4.Token5
{
    public class Class1
    {
    }
}

第一个类是我的项目的一部分,第二个类来自于我们组织内另一个小组开发的框架库。请注意第一个类的命名空间中Token2位于第二个位置,而第二个类的命名空间中Token2位于第一个位置。
我遇到的问题是似乎由于命名空间冲突,我无法在第一个类中引用第二个类。如果我尝试在第一个类中执行以下操作:
namespace Token1.Token2.Token3
{
    public class Class1
    {
        var frameworkClass1 = new Token2.Token4.Token5.Class1();
    }
}

Visual Studio的IDE在Token4上用红色突出显示,并显示“无法解析符号'Token4'”。 如果我将鼠标悬停在新建Class1的Token2上,在智能感知中显示“namespace Token1.Token2”,因此它清楚地看到了项目类的命名空间,但未看到框架类的命名空间。

由于已经存在大量代码,更改任一类库的命名空间将非常困难。 有没有办法绕过这个问题?


2
解决你的问题的方法是如果你做某事时感到疼痛,就不要再做那件事。永远不要构建命名空间,其中一个命名空间的顶级与另一个命名空间的第二级相同。这只会带来痛苦。遵循标准指南创建没有这些歧义的命名空间。你说现在不能改变它;我保证将来改变会更加困难,所以现在似乎是个好时机。 - Eric Lippert
2个回答

28

由于 Token2 也是 Token1 的子命名空间,所以您需要明确指定您正在寻找的 "根" 命名空间:

var frameworkClass1 = new global::Token2.Token4.Token5.Class1();

你也可以使用 using 语句来设置别名:

using Token5 = global::Token2.Token4.Token5;

然后只需引用别名:

var frameworkClass1 = new Token5.Class1();

如果你知道为什么使用子命名空间来限定类被认为是有用的,我认为这会是对这个答案的一个很好的扩展。(或者这里已经有另一个问题在处理它了吗?)Java没有这个问题,因为你总是必须在导入或引用类时使用完整路径,我从来没有觉得这是一种限制。 - Matthias
我无法回答为什么(或将其与Java进行比较,因为我不是Java开发人员) - 写C#语言规范的好心人([第3.8节-命名空间和类型名称](https://msdn.microsoft.com/en-us/library/aa691136.aspx))显然认为在搜索封闭命名空间时有一定的好处。 - D Stanley

3
您可以尝试使用 global::Token2 作为框架命名空间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接