嵌套的命名空间

时间:2011-06-09 18:10:00

标签: c#

我有这样的事情:

namespace n1
{
    namespace n2
    {
        class foo{}
    }
}

在我写的其他文件中:

using n1;

为什么我现在无法打字:

n2.foo smthing;

如何制作这样的东西?

5 个答案:

答案 0 :(得分:31)

这是C#的深思熟虑的规则。如果你这样做:

namespace Frobozz
{
    namespace Magic
    {
        class Lamp {}
    }

    class Foo
    {
        Magic.Lamp myLamp; // Legal; Magic means Frobozz.Magic when inside Frobozz
    }
}

这是合法的。但这不是:

namespace Frobozz
{
    namespace Magic
    {
        class Lamp {}
    }
}

namespace Flathead
{
    using Frobozz;
    class Bar
    {
        Magic.Lamp myLamp; // Illegal; merely using Frobozz does not bring Magic into scope
    }
}

描述这一点的C#规则在C#4规范的第7.6.2节中。这是一个非常令人困惑的部分;你想要的是接近结尾的段落

  

否则,如果名称空间声明的using-namespace-directive导入的名称空间只包含一个名称为I的类型...

关键是它说的是“一种类型”,而不是“一种类型或名称空间”。当您在该命名空间之外时,我们故意禁止您“切片”这个的命名空间名称,因为它可能令人困惑。正如其他人所说,如果你想做那样的事情,在using-alias指令中完全限定一次,然后使用别名。

答案 1 :(得分:26)

使用namespace aliases

using n2 = n1.n2;

...
n2.foo something;

类名之前应该是一个完整的名称空间(带有/或嵌套类型的其他类名)。截断的命名空间不起作用。

答案 2 :(得分:11)

按照设计,namespaces可以帮助您定义范围。

除非您完全符合条件,否则您将收到错误。

假设File1有这样的东西:

namespace n1
{
    namespace n2
    {
        class Foo { }
    }
}

你可以这两种方式:

完全限定using

File2内容:

namespace n3
{
    using n1.n2;

    class TestClass
    {
        private Foo something;
    }
}

使用namespace alias

namespace n3
{
    using n2 = n1.n2;

    class TestClass
    {
        private n2.Foo something;
    }
}

答案 3 :(得分:8)

C#语言规范中的第9.4.2节第4段明确解释了这种行为:

  

使用 using-namespace-directive 导入   给定的类型   命名空间,但具体不是   导入嵌套的命名空间。

它甚至会举一个与你自己非常相似的例子。

namespace N1.N2
{
    class A {}
}
namespace N3
{
    using N1;
    class B: N2.A {}        // Error, N2 unknown
}

当然你做到了这一点:

namespace n1
{
  public class Example
  {
    public static void Main()
    {
      n2.Foo a; // This is legal.
    }
  }
}

这会编译因为n2是可访问的,因为它是从祖先名称空间块中引用的。

答案 4 :(得分:0)

您不能这样写,因为n2位于n1内。如果要访问n2命名空间,可以尝试在其他文件的开头键入using n2 = n1.n2