我对一个程序集的引用有一个奇怪的问题
我有一个VS2008项目,该项目使用RootNamespace Business.CHHS
引用程序集。当我导入命名空间时,所包含的类被正确公开
但是,如果我改为使用完全限定名,则它将无法再找到引用的命名空间或其类型。
我绝对放入引用并构建解决方案(在第一个示例中编译所有内容)。当我在进口语句中输入命名空间时,我获得了对CHHS的完全智能感知支持,当我指定变量类型时,CHHS没有显示在Business命名空间下。
问:这里发生了什么?
答案 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
类
但我们不要!!!
这是因为代码在当前命名空间的层次结构中工作,并在到达根目录之前找到了业务类。为了帮助证明这一点,请查看包含 Company
:
你会发现 Company
是灰色的,因为它不需要它。它将运行相同的代码,无论是否有来自公司的资格,因为我们已经在 Company
.Application
命名空间中。
Global
如果您想要内联限定类,则需要一种方法来告诉编译器在解析类时不要查看当前的命名空间。为此,请使用提供的Namespace Global
:
一种从项目的根名称空间“逃避”类的新方法
Global告诉编译器从头开始,在这种情况下我们会立即找到Business名称空间。
您可以在不使用Global的情况下通过Imports
语句添加类的原因是默认情况下Imports
是全局的。因为你必须在定义任何Imports
之前声明Namespaces
,所以imports语句无法在文件的其余部分中假设任何后续代码块中的命名空间,因为你可以(尽管可能)不应该在单个文件中声明任意数量的命名空间。出于这个原因,Imports将始终从任何命名空间的根开始,然后继续工作。