2010-03-02 5 views
6

J'ai vu beaucoup de réponses au problème typedef en C#, que je l'ai utilisé, j'ai donc:alias nichant dans C#

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

et cela fonctionne bien. Je peux changer la définition (en particulier changer Bar => Zoo etc) et tout ce qui utilise les changements de Foo. Génial.

Maintenant, je veux que cela fonctionne:

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

mais C# ne semble pas comme Foo dans la deuxième ligne, même si je l'ai défini dans le premier.

Existe-t-il un moyen d'utiliser un alias existant dans le cadre d'un autre?

Edit: J'utilise VS2008

+0

TBH cela ressemble à un bug – Codesleuth

+0

D'accord avec Codesleuth - il échoue encore si Foo est un alias pour un type simple (comme System.Int32), donc je suppose que c'est un bug de compilateur. –

+1

@Codesleuth @Dan, vous voulez commenter la réponse de Dave? – quamrana

Répondre

13

Selon la norme, il semble que la réponse est non. De Section 16.3.1, paragraphe 6:

1 L'ordre dans lequel à l'aide-alias-directives sont écrites a aucune signification, et la résolution de l'espace de noms ou de type nom référencé par un en utilisant-alias- directive n'est pas affectée par la directive using-alias elle-même ou par d'autres using-directives dans le contenant immédiatement la compilation unité ou le corps de l'espace de noms.

2 En d'autres mots , l'espace de noms ou de type nom d'un à l'aide-alias-directive est résolu comme si le contenant immédiatement unité compilation ou corps namespace avait pas en utilisant les Directives.

Edit:

Je viens de remarquer que la version sur le lien ci-dessus est un peu obsolète. Le texte du paragraphe correspondant dans le 4th Edition est plus détaillé, mais interdit toujours le référencement en utilisant des alias dans d'autres. Il contient également un exemple qui rend cela explicite.

En fonction de vos besoins en matière de détermination de la portée et la force de taper, vous pourriez être en mesure de sortir avec quelque chose comme:

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