嵌套的命名空间

我有这样的事情:

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

在我写的其他文件中:

 using n1; 

为什么我现在无法打字:

 n2.foo smthing; 

如何制作这样的东西呢?

使用命名空间别名 :

 using n2 = n1.n2; ... n2.foo something; 

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

这是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指令中完全限定一次,然后使用别名。

通过设计, 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; } } 

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是可访问的,因为它是从祖先命名空间块中引用的。

你不能写这个,因为n2n1里面。 如果要访问n2名称空间,可以尝试在其他文件的开头using n2 = n1.n2键入。