web-dev-qa-db-fra.com

Vous utilisez une «utilisation d'alias = classe» avec des types génériques?

Donc, parfois, je veux inclure une seule classe d'un espace de noms plutôt qu'un espace de noms entier, comme l'exemple ici, je crée un alias pour cette classe avec l'instruction using:

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

Je le fais souvent avec des génériques pour ne pas avoir à répéter les arguments:

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

Maintenant, je veux accomplir la même chose avec un type générique, tout en le préservant comme type générique:

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

Mais cela ne se compile pas, donc existe-t-il un moyen de créer cet alias tout en laissant le type générique?

88
csharptest.net

Non, il n'y en a pas. Un alias de type en C # doit être un type fermé (alias entièrement résolu) afin que les génériques ouverts ne soient pas pris en charge

Ceci est couvert dans la section 9.4.1 de la spécification du langage C #.

L'utilisation d'alias peut nommer un type construit fermé, mais ne peut pas nommer un type générique non lié déclaration sans fournir d'arguments de type.

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
}
89
JaredPar

comme indiqué sur http://msdn.Microsoft.com/en-us/library/sf0df423.aspx et http://msdn.Microsoft.com/en-us/library/ c3ay4x3d% 28VS.80% 29.aspx , vous pouvez le faire

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

puis utiliser

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

ou

GenList x = new GenList();

cependant, vous devez répliquer ceux qui utilisent des définitions dans chaque fichier où vous les utilisez, donc si vous y apportez des modifications à l'avenir et oubliez de mettre à jour à chaque fichier, les choses vont mal se passer.

J'espère que C # à l'avenir traitera les alias comme le font les méthodes d'extension et vous permettra de définir bon nombre d'entre eux dans un fichier que vous utilisez ailleurs, puis de les conserver à un endroit et de masquer les détails de mappage de type inutiles internes aux consommateurs de type.

8
George Birbilis