【问题标题】:I can import a namespace but can't use fully qualified class names我可以导入命名空间但不能使用完全限定的类名
【发布时间】:2013-08-19 13:57:45
【问题描述】:
我在引用程序集时遇到了一个奇怪的问题
我有一个 VS2008 项目,它引用了一个带有 RootNamespace Business.CHHS 的程序集。当我导入命名空间时,包含的类会正确暴露
但是,如果我改为使用完全限定名称,它就无法再找到引用的命名空间或其类型。
我确实已经加入了参考并构建了解决方案(所有内容都在第一个示例中编译)。当我在导入语句中输入命名空间时,我获得了对 CHHS 的完整智能支持,当我指定变量类型时,CHHS 不会显示在 Business 命名空间下。
问:这是怎么回事?
【问题讨论】:
标签:
.net
vb.net
namespaces
【解决方案1】:
当您尝试使用也存在于当前作用域命名空间层次结构中的任何位置的命名空间时,就会发生这种情况。让我用下面的例子来解释一下:
假设你有以下代码:
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 默认情况下是全局的。因为您必须在定义任何Namespaces 之前声明Imports,所以imports 语句无法推测文件其余部分中任何后续代码块中的命名空间是什么,因为您可以(尽管可能不应该)在单个文件中声明任意数量的命名空间。出于这个原因,Imports 将始终从任何命名空间的根开始,并一直向下工作。