C# 访问由本地名称隐藏的全局类名
例如:C# 访问由本地名称隐藏的全局类名,c#,C#,例如: namespace MyApp.NET { class Class1 { public enum Types : byte = {t1, t2, t3}; public Types m_type = t1; } class Class2 { Class1 [] m_data = new Class1 [100]; public Class1 Class1 (int i) { return m_dat
namespace MyApp.NET
{
class Class1
{
public enum Types : byte = {t1, t2, t3};
public Types m_type = t1;
}
class Class2
{
Class1 [] m_data = new Class1 [100];
public Class1 Class1 (int i) { return m_data [i]; }
void Method2 (Class1 c)
{
if (c.m_type == Class1.Types.t1) {}
}
}
class MyApp
{
}
}
由于方法Class2.Class1,Class1.Types.t1不可见。是否有方法限定Class1.Types.t1,以便在上述上下文中可以访问它?名称空间与另一个类具有相同的部分名称,这使问题变得复杂
myNameSpace.Class1.Types.t1
是,按名称空间:
myNameSpace.Class1.Types.t1
。如果这些类型不在命名空间中,则可以通过强制全局作用域对其进行限定:global::Class1.types.t1
您可以按如下方式开始限定:
if (c.m_type == myNameSpace.Class1.Types.t1)
if (c.m_type == NET.Class1.Types.t1) {}
或者,如果为Class1
类添加别名:
namespace MyApp.NET
{
using C1 = Class1;
...
}
您的if
语句可以变成:
if (c.m_type == C1.Types.t1) {}
这会让你做你想做的事。global::MyApp.Net.Class1.Types.t1你是说myNameSpace.Class1.Types.t1?我试过了,但实际的名称空间名是“DLE.Net”,使用“DLE.Net.Class1”产生了一个错误,因为我还有一个全局类“DLE”,所以MSVC 2010将“DLE.Net”误认为是类“DLE”的成员。我可能需要重命名我的命名空间…如果命名空间中有与命名空间同名的类,我现在知道如何重命名:我需要在命名空间名称前面加上“global::”。感谢您的输入,但在我看来,这类事情模糊了代码。@karx11erx:我刚刚注意到,在尝试这一点时,我在测试代码中使用了一个内部名称空间,因此我在编辑后的答案中添加了一个更简单的解决方案。cdhowies答案使我走上了正确的道路,我后来甚至在IDE自动创建的项目的某些代码中也发现了这一点。