每当您尝试使用也存在于当前作用域命名空间层次结构中的任何位置的命名空间时,都会发生这种情况。让我用下面的例子来解释一下:
假设您有以下代码:
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 的限定,因为我们已经在命名空间中。Company
.Application
解决方案 - 使用Global
如果您想内联限定类,则需要一种方法告诉编译器在解析类时不要查看当前命名空间的内部。为此,使用Namespace Global
提供:
一种从项目的根命名空间中“逃脱”类的新方法
Global 告诉编译器从头开始,在这种情况下,我们会立即找到 Business 命名空间。
你可以通过Imports
语句添加类而不使用 Global 的原因是因为Imports
默认情况下是全局的。因为您必须Imports
在定义 any 之前声明Namespaces
,所以 imports 语句无法推测文件其余部分的任何后续代码块中的命名空间是什么,因为您可以(尽管可能不应该)声明与您一样多的命名空间想要在一个文件中。出于这个原因,Imports 将始终从任何命名空间的根目录开始,并且一直向下工作。