2010-03-02 6 views
6

Ich habe viele Antworten auf die typedef Problem in C# zu sehen, die ich verwendet habe, so habe ich:Nesting Aliase in C#

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

und das funktioniert gut. Ich kann die Definition ändern (besonders Änderung Bar => Zoo usw.) und alles, das Foo benutzt, ändert sich. Groß.

Jetzt möchte ich dies funktioniert:

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

aber C# nicht Foo in der zweiten Zeile zu mögen scheint, obwohl ich es in der ersten definiert haben.

Gibt es eine Möglichkeit, einen vorhandenen Alias ​​als Teil eines anderen zu verwenden?

Edit: Ich verwende VS2008

+0

TBH sieht aus wie ein Bug – Codesleuth

+0

mit Codesleuth Agree - es immer noch nicht, wenn Foo ein Alias ​​ist für einen einfachen Typ (wie System.Int32), also vermute ich, dass dies ein Compiler Bug ist. –

+1

@Codesleuth @Dan, interessieren Daves Antwort? – quamrana

Antwort

13

den Standard zufolge sieht es aus wie die Antwort nein ist. Von Section 16.3.1 Absatz 6:

1 Die Reihenfolge, in der Alias-using-Direktiven geschrieben hat keine Bedeutung, und die Auflösung des Namespace-oder-Typnamen von einer using-Alias- verwiesen Richtlinie ist nicht betroffen durch die Verwendung von Alias-Direktive selbst oder von anderen using-Direktiven in der sofort enthält Kompilierung Einheit oder Namespace-Körper.

2 In anderen Worten wird der Namespace-oder-Typname einer Alias-using-Direktive als aufgelöst, wenn die unmittelbar enthalten Kompilierungseinheit oder Namespace Körper keine using-Direktiven hat.

Edit:

Ich habe gerade bemerkt, dass die Version auf dem obigen Link ein bisschen veraltet ist. Der Text aus dem entsprechenden Absatz in der 4th Edition ist detaillierter, verbietet aber immer noch die Verwendung von Aliasen in anderen. Es enthält auch ein Beispiel, das dies explizit macht.

Je nach Bedarf für Scoping und die Stärke der Eingabe Sie könnten in der Lage sein, weg wie mit etwas zu bekommen:

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