Espacio de nombres distribuidos
Si hacemos varias definiciones de un espacio de nombres en un mismo o diferentes ficheros y se compilan todas juntas, el compilador las fusionará en una sola definición cuyos miembros serán la concatenación de los de definición realizada. Por ejemplo:
namespace A // (1) { class B1 {} }
namespace A // (2) { class B2 {} }
|
Una definición como la anterior es tratada por el compilador exactamente igual que:
namespace A { class B1 {} class B2 {} }
|
Y lo mismo ocurriría si las definiciones marcadas como (1) y (2) se hubiesen hecho en ficheros separados que se compilasen conjuntamente.
Hay que tener en cuenta que las sentencias using, ya sean de importación de espacios de nombres o de definición de alias, no son consideradas miembros de los espacios de nombres y por tanto no participan en sus fusiones. Así, el siguiente código es inválido:
namespace A { class ClaseA {} }
namespace B { using A; } namespace B { // using A; class Principal: ClaseA {} }
|
Este código no es correcto porque aunque se importa el espacio de nombres A al principio de una definición del espacio de nombres donde se ha definido Principal, no se importa en la misma definición donde se deriva Principal de A.ClaseA. Para que el código compilase habría que descomentar la línea comentada.