sirve que para namespace multiple into example clase addnamespacedeclaration c# .net namespaces

c# - que - Colisiones del espacio de nombres



namespace c# example (3)

¿Estás trabajando en un espacio de nombres que está bajo el espacio de nombres AB? (por ejemplo ABX) si es así, las resoluciones del espacio de nombres C # ( ECMA-334 C # Language Specification: 10.8 10.8 Namespace and type names ) dice:

... para cada espacio de nombre N, comenzando por el espacio de nombre en el que aparece el espacio de nombre o tipo, continuando con cada espacio de nombre adjunto (si existe) y terminando con el espacio de nombre global, los siguientes pasos se evalúan hasta que se localice una entidad. ..

y luego seguido de:

Si K es cero y la declaración del espacio de nombres contiene una directiva extern-alias o usa-aliasdirective que asocia el nombre I con un espacio de nombres o tipo importado, entonces el nombre-tipo-o-nombre-nombre se refiere a ese espacio de nombres o tipo

Esto significa que la resolución del nombre comienza en el espacio de nombre actual y busca todos los espacios de nombres hasta la raíz, y solo después de que finaliza esta búsqueda jerárquica, se buscan los espacios de nombres importados con la cláusula using .

El siguiente ejemplo imprime "Ns1.Foo"

using Ns1.Foo.Foo2; namespace Ns1.Foo { class Foo { public void Print() { System.Console.WriteLine("Ns1.Foo"); } } } namespace Ns1.Foo.Foo2 { class Foo { public void Print() { System.Console.WriteLine("Ns1.Foo.Foo2"); } } } namespace Ns1.Foo.Bar { class Bar { public void Print() { new Foo().Print(); } static void Main() { new Bar().Print(); } } }

Editar: Agregar una cláusula de uso dentro de un espacio de nombres, hará que el espacio de nombres se busque antes de que se realice la búsqueda jerárquica del espacio de nombres actual. Cambiar el ejemplo a:

namespace Ns1.Foo.Bar { using Ns1.Foo.Foo2; class Bar { public void Print() { new Foo().Print(); } static void Main() { new Bar().Print(); } } }

y Ns1.Foo.Foo2 será impreso.

Editar: ejemplo cambiado

¿Cómo es posible que .NET encuentre el ''MyType'' incorrecto en este escenario?

Tengo un tipo ABCDMyType en un proyecto en el que estoy trabajando, y estoy haciendo referencia a una DLL que tiene un tipo ABMyType? No tengo ningún ''uso de AB;'' declaraciones en cualquier parte de mi código, y tengo ''using ABCD;''. Cuando compilo, el compilador piensa que cualquier referencia desnuda a ''MyType'' significa ''ABMyType''.

Sé que podría cambiar el nombre de la clase o usar un alias, pero me pregunto cómo es posible.

¿Algunas ideas?

¡Gracias!


¿Tu código está en el espacio de nombres AB o ABC ? Si es así, ese es probablemente el problema. Use una directiva de uso como esta:

using TheTypeIWant = A.B.C.D.MyType;

entonces simplemente refiérase a TheTypeIWant en su código.

EDITAR: Acabo de probar la opción " using MyType=ABCDMyType ", pero eso no funciona. Lo anterior está bien, sin embargo.


Solo una suposición: en las propiedades de su proyecto, ¿el "espacio de nombre predeterminado" está establecido en AB?