2011-10-17 14 views
6

Pensé que lo siguiente tiene sentido, pero no es posible y se lanzará un error: The namespace 'foo' already contains a definition for 'bar'.Espacio de nombres con el mismo nombre que el nombre de clase

namespace foo 
{ 
    public class bar { ... } 
} 

namespace foo.bar 
{ 
    public class baz : EventArgs { ... } 
} 

¿Cuál sería la forma adecuada de nombrar el espacio de nombres para un caso como este?

+3

Sin un ejemplo práctico, las sugerencias tendrán que hacer conjeturas, cubrir todas las bases potenciales, o no ser una gran respuesta; por regla general, un espacio de nombres es una categoría, o generalización, y una clase una utilidad específica: el nombramiento debe reflejar esto. Por ejemplo, el espacio de nombres 'System.Collections' y las clases, como' System.Collections.CollectionBase'. Si había un requisito para una clase llamada 'Colecciones 'en este espacio de nombres, entonces algo más está mal. –

+0

Es más o menos un ejemplo práctico. Quiero usar un tipo personalizado basado en 'EventArgs', en la clase' bar'. ¿Debería poner el tipo personalizado en el mismo espacio de nombres como 'barra'? – Stijn

Respuesta

4

Esto realmente depende de lo que está tratando de lograr. Si realmente quiere Baz para sentarse bajo el espacio de nombres foo.bar ya que depende/estrechamente ligado a que BAR puede hacer que sea una clase hija de la barra:

namespace foo 
{ 
    public class bar 
    { 
     public class baz : EventArgs { ... } 
    } 
} 

Ahora puede crear una nueva instancia como:

var test = new foo.bar.baz(); 
+0

Esto se parece a lo que quiero lograr. Lo aceptaré una vez que esté permitido. – Stijn

4

Tienes que encontrar otro nombre para el espacio de nombres o el nombre de la clase. No hay forma de evitarlo.

Encontrar nombres apropiados es difícil pero se puede hacer.

1

Dentro del mismo espacio de nombres no es posible tener el mismo nombre de clase. Si sus espacios de nombres se parecen tanto, probablemente los quiera en el mismo espacio de nombres. Si este no es el caso, probablemente necesite reconsiderar una clasificación lógica de sus clases dentro de los espacios de nombres.

+1

De acuerdo, '.' en un espacio de nombres está destinado a causar confusión más adelante en la línea. – christofr

0

puede haber

namespace foo_bar 
{ 
    public class baz : EventArgs { ... } 
} 

De lo contrario, simplemente no es posible

7

Debe comprender que, en el contexto del CLR, no existe el espacio de nombres. Los espacios de nombres son puramente una función de idioma que existe solo para simplificar el código, por lo que no siempre debemos leer nombres de clases totalmente calificados.

En su ejemplo,

namespace foo 
{ 
    public class bar { ... } 
} 



namespace foo.bar 
{ 
    public class baz : EventArgs { ... } 
} 

cuando se compila el código fuente, la IL ni siquiera es consciente de que hay dos espacios de nombres - foo y foo.bar. En cambio, solo conoce las definiciones de clase. En este caso, cuando se trata a través de la barra de la clase, que sabe que usted tiene una clase llamada foo.bar

Cuando se trata a través de la baz clase, resuelve el nombre completo de la clase como foo.bar. baz

Pero si este fuera el caso, baz debería haberse declarado legítimamente dentro de la definición de clase de barra y no en un espacio de nombres separado como lo ha hecho aquí.

+0

+1 para una explicación técnica detrás de esto. – Stijn

Cuestiones relacionadas