【问题标题】: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;

我错过了什么吗?

【问题讨论】:

  • VB.Net 这样做; C# 没有。

标签: c# namespaces language-features using


【解决方案1】:

C# 实际上并没有子命名空间的概念。命名空间名称中的句点仅用于逻辑组织目的。

SystemSystem.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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-09
        • 1970-01-01
        相关资源
        最近更新 更多