Si hacemos varias definiciones de
un espacio de nombres en un mismo fichero o en diferentes y se compilan todas
juntas, el compilador las fusionará en una sola definición cuyos miembros serán
la concatenación de los miembros definidos en cada una de las definiciones realizadas. Por ejemplo:
namespace A // (1)
{
class B1 {}
}
namespace A
// (2)
{
class B2 {}
}
Hacer una definición como la
anterior es tratada por el compilador exactamente igual que si se hubiese
hecho:
namespace A
{
class B1 {}
class B2 {}
}
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 válido debido a
que 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 definición en donde se
deriva Principal de A.ClaseA. Para que todo funcionase a la perfección
habría que descomentar la línea comentada en el ejemplo.