我可以导入命名空间但不能使用完全限定的类名

时间:2013-08-19 13:57:46

标签: .net vb.net namespaces

我对一个程序集的引用有一个奇怪的问题

我有一个VS2008项目,该项目使用RootNamespace Business.CHHS引用程序集。当我导入命名空间时,所包含的类被正确公开

Working

但是,如果我改为使用完全限定名,则它将无法再找到引用的命名空间或其类型。

NotWorking

我绝对放入引用并构建解决方案(在第一个示例中编译所有内容)。当我在进口语句中输入命名空间时,我获得了对CHHS的完全智能感知支持,当我指定变量类型时,CHHS没有显示在Business命名空间下。

这里发生了什么?

1 个答案:

答案 0 :(得分:9)

只要您尝试使用当前作用域命名空间层次结构中任何位置的命名空间,就会发生这种情况。让我用以下例子解释一下:

假设您有以下代码:

Namespace Company.Application
    Module Module1
        Sub Main()
            'Code Goes Here
        End Sub
    End Module
End Namespace

Namespace Company.Application
    Public Class ApplicationClass
    End Class
End Namespace

Namespace Company.Business
    Public Class BusinessClass
    End Class
End Namespace

Namespace Business
    Public Class RootLevelBusiness
    End Class
End Namespace

现在让我们看看当我们在模块中使用 Business 命名空间时会暴露什么(我们应该看到 RootLevelBusiness

Business

但我们不要!!!

这是因为代码在当前命名空间的层次结构中工作,并在到达根目录之前找到了业务类。为了帮助证明这一点,请查看包含 Company

时会发生什么

Company

你会发现 Company 是灰色的,因为它不需要它。它将运行相同的代码,无论是否有来自公司的资格,因为我们已经在 Company .Application命名空间中。

解决方案 - 使用Global

如果您想要内联限定类,则需要一种方法来告诉编译器在解析类时不要查看当前的命名空间。为此,请使用提供的Namespace Global

  

一种从项目的根名称空间“逃避”类的新方法

global

Global告诉编译器从头开始,在这种情况下我们会立即找到Business名称空间。

您可以在不使用Global的情况下通过Imports语句添加类的原因是默认情况下Imports是全局的。因为你必须在定义任何Imports之前声明Namespaces,所以imports语句无法在文件的其余部分中假设任何后续代码块中的命名空间,因为你可以(尽管可能)不应该在单个文件中声明任意数量的命名空间。出于这个原因,Imports将始终从任何命名空间的根开始,然后继续工作。