嵌套的命名空间

Neo*_*mex 31 c#

我有这样的事情:

namespace n1
{
    namespace n2
    {
        class foo{}
    }
}
Run Code Online (Sandbox Code Playgroud)

在我写的其他文件中:

using n1;
Run Code Online (Sandbox Code Playgroud)

为什么我现在无法打字:

n2.foo smthing;
Run Code Online (Sandbox Code Playgroud)

如何制作这样的东西呢?

Eri*_*ert 32

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

namespace Frobozz
{
    namespace Magic
    {
        class Lamp {}
    }

    class Foo
    {
        Magic.Lamp myLamp; // Legal; Magic means Frobozz.Magic when inside Frobozz
    }
}
Run Code Online (Sandbox Code Playgroud)

这是合法的.但这不是:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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


man*_*nji 26

使用命名空间别名:

using n2 = n1.n2;

...
n2.foo something;
Run Code Online (Sandbox Code Playgroud)

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


Gus*_*ori 11

通过设计,namespaces可以帮助您定义范围.

除非您完全符合条件,否则您将收到您所看到的错误.

假设File1有这样的东西:

namespace n1
{
    namespace n2
    {
        class Foo { }
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以这两种方式:

完全合格 using

File2内容:

namespace n3
{
    using n1.n2;

    class TestClass
    {
        private Foo something;
    }
}
Run Code Online (Sandbox Code Playgroud)

用一个 namespace alias

namespace n3
{
    using n2 = n1.n2;

    class TestClass
    {
        private n2.Foo something;
    }
}
Run Code Online (Sandbox Code Playgroud)


Bri*_*eon 8

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

一个using命名空间指令导入包含在给定命名空间,但具体的类型不导入嵌套的命名空间.

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

namespace N1.N2
{
    class A {}
}
namespace N3
{
    using N1;
    class B: N2.A {}        // Error, N2 unknown
}
Run Code Online (Sandbox Code Playgroud)

你当然是这样做的:

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

这将编译因为n2它是可访问的,因为它是从祖先命名空间块中引用的.