Dzisiaj mało znana funkcjonalność języka\kompilatora, która niestety czasami przydaje się. W zdecydowanej większości przypadków nie powinna ona mieć w projekcie zastosowania, ale wiadomo, czasami nie mamy na to wpływu.
Problem dotyczy scenariusza, gdy mamy dwa typy o takiej samej nazwie, znajdujące się w takiej samej przestrzeni nazw. Oczywiście taka sytuacja wymaga, aby podane typy były umieszczone w różnych projektach (inaczej nastąpiłby błąd kompilacji). Przy wielkich systemach, w których nie przestrzega się dobrych praktyk dotyczących nazewnictwa i podziału na namespace, może okazać się, że podanych typów nie będzie można bezpośrednio użyć w projekcie. Załóżmy, że w projektach Lib1 oraz Lib2 mamy następującą klasę:
public class Type { }
Oczywiście w praktyce, klasy w Lib1 i Lib2 miałby zupełnie inną implementację – to tylko uproszczenie. Następnie w jakimś projekcie, dodajemy referencje zarówno do Lib1 jak i Lib2. Struktura całej solucji wygląda więc następująco:
Co się stanie jeśli będziemy chcieli użyć Type, np.:?
Type type=new Type();
Oczywiście nastąpi błąd kompilacji:
Error 1 The type 'Type' exists in both 'Debug\Lib1.dll' and 'Debug\Lib2.dll'
Do rozwiązywania takich konfliktów służą zewnętrzne aliasy. W pierwszej kolejności otwieramy okienko “Properties” dla referencji i ustawiamy kolejno aliasy dla Lib1 oraz Lib2:
Domyślna wartość to global. Niestety zarówno Lib1.Type jak i Lib2.Type były ustawione na global, stąd niemożliwe było korzystanie z klas. Dla tego przykładu ustawmy aliasy kolejno na Lib1Test oraz Lib2Test.
Czy to znaczy, że teraz można do typów dostać się za pomocą Lib1Test::Type, podobnie jak było to z global::Type?
Tak, ale najpierw musimy podlinkować wspomniane aliasy za pomocą extern alias:
extern alias Lib1Test; extern alias Lib2Test;
Powyższe deklaracje powinny znajdować się na samej górze pliku. Dzięki temu, inicjalizacja obiektu wygląda następująco:
Lib1Test::Type type1=new Lib1Test::Type(); Lib2Test::Type type2 = new Lib2Test::Type();
Mam nadzieję jednak, że nikt z Was nie będzie musiał korzystać z takich hack’ów…
Nie łatwiej dodać usinga na typ?