Aún en el caso de que usemos
espacios de nombres distintos para diferenciar clases con igual nombre pero
procedentes de distintos fabricantes, podrían darse conflictos sin usamos
sentencias using
para importar los espacios de nombres de dichos fabricantes ya que
entonces al hacerse referencia a una de las clases comunes con tan solo su
nombre simple el compilador no podrá determinar a cual de ellas en concreto nos
referimos.
Por ejemplo, si tenemos una clase
de nombre completamente calificado A.Clase,
otra de nombre B.Clase, y
hacemos:
using A;
using B;
class EjemploConflicto: Clase
{}
¿Cómo sabrá el compilador si lo
que queremos es derivar de A.Clase
o de B.Clase? En realidad el
compilador no puede determinarlo y producirá un error informando de que hay una
referencia ambigua a Clase.
Para resolver ambigüedades de
este tipo podría hacerse referencia a los tipos en conflicto usando siempre sus
nombres completamente calificados, pero ello puede llegar a ser muy fatigoso
sobre todo si sus nombres son muy largos. Para solucionar los conflictos de
nombres sin tener que escribir tanto se ha incluido en C# la posibilidad de
definir alias para cualquier tipo de
dato, que son sinónimos para los mismos que se definen usando la siguiente
sintaxis:
using <alias> =
<nombreCompletoTipo>;
Como cualquier otro using,
las definiciones de alias sólo pueden incluirse al principio de las
definiciones de espacios de nombres y sólo tienen validez dentro de las mismas.
Definiendo alias distintos para
los tipos en conflictos se resuelven los problemas de ambigüedades. Por
ejemplo, el problema del ejemplo anterior se podría resolver así:
using A;
using B;
using ClaseA = A.Clase;
class EjemploConflicto: ClaseA
{} // Heredamos de A.Clase
Los alias no tienen porqué ser
sólo referentes a tipos, sino que también es posible escribir alias de espacios
de nombres como muestra el siguiente ejemplo:
namespace N1.N2
{
class A {}
}
namespace N3
{
using R1 = N1;
using R2 = N1.N2;
class B
{
N1.N2.A a; // Campo
de nombre completamente calificado N1.N2.A
R1.N2.A
b; // Campo de nombre completamente calificado N1.N2.A
R2.A
c; //
Campo de nombre completamente calificado N1.N2.A
}
}
Al definir alias hay que tener
cuidado con no definir en un mismo espacio de nombres varios con igual nombre o
cuyos nombres coincidan con los de miembros de dicho espacio de nombres.
También hay que tener en cuenta que no se pueden definir unos alias en función
de otro, por lo que códigos como el siguiente son incorrectos:
namespace N1.N2 {}
namespace N3
{
using R1 =
N1;
using R2 =
N1.N2;
using R3 =
R1.N2; // ERROR: No se puede definir R3 en función de R1
}