¿Cómo sabe VB.NET qué variable configurar si el nombre de la variable aparece en 2 módulos en 2 dlls?

Así que pasé 2 horas intentando descifrar este extraño error en VB.NET. Finalmente lo descubrí, pero no puedo entender por qué a veces funcionaría y otras no. Tenía 2 DLL, las cuales tenían un MÓDULO llamado _Main.vb que tenía una variable llamada "MDIParentForm". Si importo ambas DLL como referencias para un tercer ensamblaje y hago:

MDIParentForm = Something

¿Qué "MDIParentForm" estoy configurando? ¿El de la primera Asamblea? en la segunda Asamblea? Parecía que si lo ejecutaba en el modo "Depurar", establecería un ensamblaje y en "Liberar" establecería el otro ensamblaje y rompería mi código ... Soy un programador de C#/Java por naturaleza, así que realmente no entiendo cómo funciona "Módulo" en VB.NET y dado que no se requiere un espacio de nombres o un nombre de clase para llamar a sus miembros, ¿cómo diablos sabe qué miembro está configurando?

preguntado el 10 de septiembre de 12 a las 22:09

3 Respuestas

VB tiene más de una 'característica' que puede conducir a horrores de codificación como este. La solución es calificar el miembro del módulo con el nombre del módulo.

El hecho de que VB le permita usar miembros del módulo no calificados no significa que sea una buena idea.

Respondido el 10 de Septiembre de 12 a las 22:09

oh, estoy de acuerdo, pero este código estaba allí antes que yo y me quedé atrapado en la pesadilla, pero es interesante cómo decidiría resolver esto. Parece que esto debería ser un error simple y llanamente. - Denis

Puedo pensar en al menos una docena de cosas extrañas que VB permite que no deberían permitirse. - Dave Doknjas

VB6 fue aún peor. Me acabo de enterar la semana pasada que VB6 le permite anular las funciones internas de VB. Yikes... eso es un desastre esperando a suceder. - logixólogo

Esta capacidad es principalmente un legado de VB 6.0, que era un lenguaje de procedimiento, no un lenguaje orientado a objetos.

Microsoft tomó algunas malas decisiones (en mi humilde opinión) en la especificación VB.NET para facilitar la conversión de programas VB 6.0 a .NET. Habiendo convertido muchos programas VB 6.0, puedo decir, sin dudarlo, que fallaron en el objetivo de facilitar las conversiones.

Dicho esto, encuentro que la función es útil para funciones de utilidad y objetos únicos.

Para más detalles y diatribas

Para responder a su pregunta real ...

Si el identificador está definido en el mismo ensamblaje, utilizará ese. Si está definido en un solo ensamblaje al que se hace referencia, usará ese. En el caso de que esté definido por múltiples ensamblajes, debemos requerirá que lo califique completamente con el nombre del ensamblado. Al menos eso es lo que yo entiendo.

Asegurarse Opción estricta y Opción explícita se activan a nivel de proyecto. También intente importar solo uno de los espacios de nombres del ensamblado en la parte superior de su archivo vb. Si lo hace, debería obtener resultados más consistentes como mínimo.

tl; dr

Simplemente califique completamente cada referencia al identificador con el dll y el nombre del espacio de nombres.

contestado el 23 de mayo de 17 a las 12:05

He intentado replicar su escenario y, sin embargo (con vbc correspondiente a VS2008) Siempre recibo un error de compilación:

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

y esto era independiente de Option Strict or Option Explicit On or Off.

Y solo para aclarar, dijo "dado que no se requiere ningún espacio de nombres o nombre de clase para llamar a sus miembros": esto no es cierto, exactamente necesita asegurarse de que el Namespace está disponible; entonces el contenido de la Module .

Respondido el 29 de junio de 13 a las 07:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.