2011-02-08 12 views
68

Así que a veces quiero incluir sólo una clase de un espacio de nombres en lugar de todo un espacio de nombres, como el ejemplo que aquí se crea un alias para esa clase con la instrucción using:¿Usando un 'using alias = class' con tipos genéricos?

using System; 
using System.Text; 
using Array = System.Collections.ArrayList; 

hago a menudo esto con los genéricos por lo que yo no tengo que repetir los argumentos:

using LookupDictionary = System.Collections.Generic.Dictionary<string, int>; 

Ahora quiero lograr lo mismo con un tipo genérico, preservando al mismo tiempo como un tipo genérico:

using List<T> = System.Collections.Generic.List<T>; 

Pero eso no se compila, ¿hay alguna forma de lograr crear este alias dejando el tipo como genérico?

+0

Creo que esto podría ser un duplicado de http://stackoverflow.com/q/3720222/105570. –

Respuesta

73

No, no hay. Un alias de tipo en C# debe ser un tipo cerrado (también conocido como totalmente resuelto) para que los genéricos abiertos no sean compatibles

Esto se trata en la sección 9.4.1 de la especificación del lenguaje C#.

el uso de alias pueden nombrar un tipo construido cerrado, pero no pueden nombrar un no unido declaración de tipo genérico sin suministrar argumentos de tipo.

namespace N2 
{ 
    using W = N1.A;   // Error, cannot name unbound generic type 
    using X = N1.A.B;   // Error, cannot name unbound generic type 
    using Y = N1.A<int>;  // Ok, can name closed constructed type 
    using Z<T> = N1.A<T>; // Error, using alias cannot have type parameters 
} 
+1

Una directiva que usa alias no puede tener un tipo genérico abierto en el lado derecho. Por ejemplo, no puede crear un alias de uso para una lista , pero puede crear uno para una lista . http://msdn.microsoft.com/en-us/library/sf0df423.aspx –

+2

Respuesta decepcionante pero upvoting de todos modos (ya que la respuesta es correcta y relevante). : -/ – BrainSlugs83

+8

Boo. C# me hace perder tanto las plantillas de C++. Y los mensajes de error de la plantilla de C++ me hacen perder C#. – Grault

3

como se muestra en http://msdn.microsoft.com/en-us/library/sf0df423.aspx y http://msdn.microsoft.com/en-us/library/c3ay4x3d%28VS.80%29.aspx, puede hacerlo

using gen = System.Collections.Generic; 
using GenList = System.Collections.Generic.List<int>; 

y luego usar

gen::List<int> x = new gen::List<int>; 

o

GenList x = new GenList(); 

, sin embargo, tiene que replicar las definiciones que utilizan en cada archivo donde los utiliza, por lo que si realiza algunos cambios en el futuro y se olvida de actualizar en cada archivo, las cosas se romperán mal.

Espero C# en el futuro Tratará los alias como lo hace con los métodos de extensión y le permitirá definir muchos de ellos en un archivo que use en otro lugar, luego mantenerlos en un lugar y ocultar los detalles innecesarios tipo consumidores

+7

, ya que alguien me preguntó: sí sé que esta es una discusión antigua, pero acabo de tener el mismo problema y el motor de búsqueda me llevó hasta aquí. ¿Por qué debería importarme si esta es una discusión antigua? ¿Estamos haciendo las noticias? –

+1

Obtuve un comportamiento aún peor en los foros de Silverlight; simplemente eliminan cualquier publicación en debates anteriores. Realmente no entienden que la gente se encuentre con estos asuntos una y otra vez y lleguen a discusiones que tienen información parcial porque nadie se molestó en agregar algunas notas mentales después de encontrar la respuesta al problema.Su excusa era que trae viejas discusiones a la cima (como si no hubiera nuevas respuestas o desarrollos mejores para agregar). Deben arreglar esos foros para no incluir temas muy antiguos en la parte delantera cuando se actualicen, a menos que un administrador los coloque en la parte superior en lugar de perder el tiempo ... –

+3

Downvoted porque la respuesta no fue útil: todo lo que se muestra ya fue declarado en el OP y no es una respuesta útil; de hecho, este conocimiento es un prerrequisito requerido para hacer la pregunta del OP en primer lugar. (En cuanto a las cosas de "discusión anterior", no estoy seguro de cómo es relevante, Stack Overflow en realidad lo recompensa por contribuir a discusiones anteriores; consulte la insignia "Nigromante"). – BrainSlugs83