Zewnętrzne aliasy – extern alias

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:

image

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:

image

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…

One thought on “Zewnętrzne aliasy – extern alias”

Leave a Reply

Your email address will not be published.