【问题标题】:using directive to import subnamespaces使用指令导入子命名空间
【发布时间】:2011-07-01 11:57:34
【问题描述】:
如果我导入这样的命名空间:
using System;
为什么我不能像这样访问子命名空间 IO:
IO.FileInfo fi;
我必须写一个完整的路径:
System.IO.FileInfo fi;
或者导入整个 IO 命名空间并使用没有命名空间的类
using System.IO;
FileInfo fi;
我错过了什么吗?
【问题讨论】:
标签:
c#
namespaces
language-features
using
【解决方案1】:
C# 实际上并没有子命名空间的概念。命名空间名称中的句点仅用于逻辑组织目的。
System 和 System.IO 就 C# 而言是两个不同的命名空间。
如果您只需要 FileInfo 类,您可以这样做:
using FileInfo = System.IO.FileInfo;
【解决方案2】:
虽然从“命名空间”和“子命名空间”的角度考虑通常很方便,但实际上只有类型名称。
在这种情况下,只有一个类型:System.IO.FileInfo
using 指令允许编译器将System. 添加到任何类型以查看它是否找到匹配的类型名称。但是,这不会找到 IO.FileInfo,因为它将寻找包含 FileInfo 嵌套类型的 IO 类型。
语言的设计方式可能看起来更麻烦,但它消除了嵌套类型名称与命名空间名称的混淆,因为它只查找 using 指令中定义的命名空间内的类型。这减少了类型命名冲突的机会。
【解决方案3】:
只有当上下文类型在相同的命名空间层次结构中时,您尝试执行的操作才有效,例如:
namespace System {
class MyClass {
IO.FileInfo fi;
}
}
你也可以有相对导入,像这样:
namespace System {
using IO;
}