类名称空间隐藏的C#引用名称空间
我有一门课是这样的:类名称空间隐藏的C#引用名称空间,c#,visual-studio,C#,Visual Studio,我有一门课是这样的: namespace Token1.Token2.Token3 { public class Class1 { } } namespace Token2.Token4.Token5 { public class Class1 { } } 还有另一个类似的类: namespace Token1.Token2.Token3 { public class Class1 { } } namespace To
namespace Token1.Token2.Token3
{
public class Class1
{
}
}
namespace Token2.Token4.Token5
{
public class Class1
{
}
}
还有另一个类似的类:
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以红色突出显示标记4,并表示“无法解析符号‘标记4’”。如果我将鼠标悬停在Token2上,在那里我将新建Class1,intellisense会显示“namespace Token1.Token2”,因此它可以清楚地看到我的项目类的名称空间,而看不到我的框架类的名称空间
由于已有大量代码,因此很难更改任何一个类库的名称空间。有没有办法解决这个问题?因为
Token2
也是Token1
的子命名空间,您需要指定您正在查找的是“根”命名空间:
var frameworkClass1 = new global::Token2.Token4.Token5.Class1();
您还可以使用语句将其别名为:
using Token5 = global::Token2.Token4.Token5;
然后只需引用别名:
var frameworkClass1 = new Token5.Class1();
您可以为框架名称空间尝试global::Token2如果您碰巧知道为什么使用子名称空间限定类是有用的,我认为这将是对这个答案的一个很好的扩展。(或者这里已经有另一个问题了吗?)Java没有这个问题,因为在导入或类引用中,您总是必须使用完整的路径,我从来没有觉得这是一个限制。我无法回答为什么(或者将它与Java进行比较,因为我不是Java开发人员)-编写C#语言规范()的好心人显然认为搜索封闭名称空间也有一些好处。解决问题的办法是,如果这样做会造成伤害,就不要这样做。千万不要在一个名称空间的顶层与另一个名称空间的第二层相同的情况下构造名称空间。它只会引起疼痛。按照标准准则创建没有这些歧义的名称空间。你说你现在不能改变它;我向你保证,未来改变会更加困难,所以现在似乎是个好时机。