2010-03-02 21 views
6

que he visto un montón de respuestas al problema typedef en C#, que he usado, así que tengo:alias de anidación en C#

using Foo = System.Collections.Generic.Queue<Bar>; 

y esto funciona bien. Puedo cambiar la definición (especialmente cambiar Bar => Zoo, etc.) y todo lo que usa Foo cambia. Estupendo.

Ahora quiero que esto funcione:

using Foo = System.Collections.Generic.Queue<Bar>; 
using FooMap = System.Collections.Generic.Dictionary<char, Foo>; 

pero C# no parece que les gusta Foo en la segunda línea, a pesar de que he definido en la primera.

¿Hay alguna manera de usar un alias existente como parte de otro?

Editar: estoy usando VS2008

+0

TBH esto parece un error – Codesleuth

+0

De acuerdo con Codesleuth - todavía falla si foo es un alias para un tipo simple (como System.Int32), así que supongo que esto es un error del compilador. –

+1

@Codesleuth @Dan, ¿te importaría comentar la respuesta de Dave? – quamrana

Respuesta

13

De acuerdo con la norma parece que la respuesta es no. De Section 16.3.1, párrafo 6:

1 El orden en el que utilizando-alias-directivas se escriben tiene ningún significado, y la resolución del espacio de nombres o nombre-tipo- referenciado por un uso-alias- directiva no se ve afectada por la directiva using-alias o por otras directivas using en el que contiene inmediatamente la compilación unidad o cuerpo del espacio de nombres.

2 En otras palabras , el espacio de nombres o nombre-tipo-de-alias utilizando directiva se resuelve como si la unidad o espacio de nombres que contiene el cuerpo de inmediato compilación tenía no utilizando-CEE.

Editar:

Acabo de notar que la versión en el enlace de arriba es un poco fuera de fecha. El texto del párrafo correspondiente en el 4th Edition es más detallado, pero aún prohíbe la referencia usando alias dentro de otros. También contiene un ejemplo que lo hace explícito.

Dependiendo de sus necesidades para la determinación del alcance y la fuerza de escribir que podría ser capaz de salirse con algo como:

class Foo : System.Collections.Generic.Queue<Bar> 
{ 
}