2010-03-02 10 views
6

Widziałem wiele odpowiedzi na problem typedef w C#, którego używałem, więc mam:zagnieżdżanie aliasy w C#

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

i to działa dobrze. Mogę zmienić definicję (szczególnie zmienić Bar => Zoo itp.) I wszystko, co używa zmian Foo. Wspaniały.

Teraz chcę to do pracy:

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

ale C# nie wydają się podoba Foo w drugiej linii, chociaż ja zdefiniowano go w pierwszej kolejności.

Czy istnieje sposób wykorzystania istniejącego aliasu jako części innego?

Edycja: używam VS2008

+0

tbh to wygląda na błąd – Codesleuth

+0

Zgadzam się z Codesleuth - to nadal nie działa, jeśli Foo jest aliasem dla prostego typu (jak System.Int32), więc domyślam się, że jest to błąd kompilatora. –

+1

@Codeleuth @Dan, czy chcesz skomentować odpowiedź Dave'a? – quamrana

Odpowiedz

13

Zgodnie z normą wygląda na to odpowiedź brzmi: nie. Od Section 16.3.1 ustęp 6:

1 Kolejność, w jakiej using-alias-dyrektyw są pisane ma żadnego znaczenia, a rozdzielczość przestrzeni nazw lub typu nazwa- odwołuje się używając-alias- nie ma wpływu dyrektywa na samą dyrektywę aliasów użycia lub przez inne dyrektywy użycia w jednostce zawierającej bezpośrednio kompilację lub jednostkę przestrzeni nazw.

2 Innymi słowy, albo typu nazwa przestrzeni nazw using-alias-dyrektywa zostanie rozwiązany jak jeśli natychmiast kompilacja zawierająca jednostka lub nazw ciało miał żadnych wykorzystujące dyrektyw.

Edit:

Właśnie zauważyłem, że wersja na powyższym linku jest nieco nieaktualne. Tekst z odpowiedniego akapitu w 4th Edition jest bardziej szczegółowy, ale nadal zabrania odwoływania się za pomocą aliasów w innych. Zawiera również przykład, który czyni to wyraźnym.

W zależności od potrzeb do określania zakresu i siły wpisywania może być w stanie uciec z czymś takim:

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