我有这样的事情:
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)
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
它是可访问的,因为它是从祖先命名空间块中引用的.
归档时间: |
|
查看次数: |
22747 次 |
最近记录: |