3

我在引用程序集时遇到了一个奇怪的问题

我有一个 VS2008 项目,它引用了一个带有 RootNamespace 的程序集Business.CHHS。当我导入命名空间时,包含的类会正确暴露

在职的

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

不工作

我肯定已经输入了参考并构建了解决方案(所有内容都在第一个示例中编译)。当我在导入语句中输入命名空间时,我得到了对 CHHS 的完全智能支持,当我指定变量类型时,CHHS 不会显示在 Business 命名空间下。

这是怎么回事?

4

1 回答 1

10

每当您尝试使用也存在于当前作用域命名空间层次结构中的任何位置的命名空间时,都会发生这种情况。让我用下面的例子来解释一下:

假设您有以下代码:

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 将始终从任何命名空间的根目录开始,并且一直向下工作。

于 2013-08-19T13:57:45.700 回答