2

所以我花了 2 个小时试图找出 VB.NET 中的这个奇怪的错误。终于弄明白了,但我不明白为什么它有时会起作用,有时不会。我有 2 个 DLL,它们都有一个名为 _Main.vb 的 MODULE,其中有一个名为“MDIParentForm”的变量。如果我将两个 DLL 作为第三个程序集的引用导入并执行以下操作:

MDIParentForm = Something

我设置的是哪个“MDIParentForm”?第一届大会中的那个?在第二次大会?似乎如果我在“调试”模式下运行它会设置一个程序集,而在“发布”模式下它会设置另一个程序集并破坏我的代码......我本质上是一个 C#/Java 程序员所以真的不明白“模块”在 VB.NET 中是如何工作的,因为调用它的成员不需要命名空间或类名,你怎么知道你正在设置什么成员?

4

3 回答 3

5

VB 有不止一个“功能”会导致像这样的编码恐惧。解决方案是使用模块名称限定模块成员。

VB 允许您使用不合格的模块成员这一事实并不意味着这是一个好主意。

于 2012-09-10T21:07:55.267 回答
2

这种能力主要是 VB 6.0 遗留下来的东西,它是一种过程语言而不是面向对象的语言。

Microsoft 在 VB.NET 规范中做出了一些糟糕的决定(以我的拙见),以便更容易地将 VB 6.0 程序转换为 .NET。在转换了许多 VB 6.0 程序之后,我可以毫不犹豫地说,它们未能实现使转换更容易的目标。

话虽如此,我确实发现该功能对函数和单例对象等实用程序很有用。

有关更多详细信息和咆哮

要回答您的实际问题...

如果标识符是在同一个程序集中定义的,它将使用那个。如果它是在单个引用的程序集中定义的,它将使用该程序集。在它由多个程序集定义的情况下,它应该要求您使用程序集名称完全限定它。至少这是我的理解。

确保在项目级别打开Option StrictOption Explicit 。还可以尝试在 vb 文件的顶部仅导入程序集的命名空间之一。这样做至少应该得到更一致的结果。

tl;博士

只需使用 dll 和命名空间名称完全限定对标识符的每个引用。

于 2012-09-10T23:14:53.457 回答
0

我试图复制你的场景,但是(vbc对应于 VS2008)我总是收到一个编译错误:

'MDIParentForm' is ambiguous between declarations in Modules 'Test.M' and 'Test.M'.

这与Option Strictor Option Explicit Onor无关Off

只是为了澄清,你说“因为不需要命名空间或类名来调用它的成员”:这不是真的,你确实需要确保它Namespace是可用的;那么内容Module就是。

于 2013-06-29T06:28:17.717 回答