Страница 246 из 502
<b> val = n;</b>
<b> }</b>
<b> }</b>
<b>}</b>
<b>class WhyAliasQualifier {</b>
<b> static void Main() {</b>
<b> int i;</b>
<b> // Следующая строка, по существу, неоднозначна!</b>
<b> // Неясно, делается ли в ней ссылка на класс CountDown</b>
<b> // из пространства имен Counter или AnotherCounter?</b>
<b> CountDown cd1 = new CountDown(10); // Ошибка!!!</b>
<b> // ...</b>
<b> }</b>
<b>}</b>
Если попытаться скомпилировать эту программу, то будет получено сообщение об ошибке, уведомляющее о неоднозначности в следующей строке кода из метода Main().
<b>CountDown cd1 = new CountDown(10); // Ошибка!!!</b>
Причина подобной неоднозначности заключается в том, что в обоих прострайствах имен, Counter и AnotherCounter, объявлен класс CountDown и оба пространства сделаны видимыми. Поэтому неясно, к какому именно варианту класса CountDown следует отнести приведенное выше объявление. Для устранения подобного рода недоразумений и предназначен описатель ::.
Для того чтобы воспользоваться описателем ::, необходимо сначала определить псевдоним для пространства имен, которое требуется описать, а затем дополнить описание неоднозначного элемента этим псевдонимом. Ниже приведен вариант предыдущего примера программы, в котором устраняется упомянутая выше неоднозначность.
<b>// Продемонстрировать применение описателя ::.</b>
<b>using System;</b>
<b>using Counter;</b>
<b>using AnotherCounter;</b>
<b>// Присвоить классу Counter псевдоним Ctr.</b>
<b>using Ctr = Counter;</b>
<b>// Объявить пространство имен для счетчиков,</b>
<b>namespace Counter {</b>
<b> // Простой вычитающий счетчик,</b>
<b> class CountDown {</b>
<b> int val;</b>
<b> public CountDown(int n) {</b>
<b> val = n;</b>
<b> }</b>
<b> }</b>
<b>}</b>
<b>// Объявить еще одно пространство имен для счетчиков,</b>
<b>namespace AnotherCounter {</b>
<b> // Объявить еще один класс CountDown, принадлежащий </b>
<b> // пространству имен AnotherCounter.</b>
<b> class CountDown {</b>
<b> int val;</b>
<b> public CountDown(int n) {</b>
<b> val = n;</b>
<b> }</b>
<b> // ...</b>
<b> }</b>
<b>}</b>
<b>class AliasQualifierDemo {</b>
<b> static void Main() {</b>
<b> // Здесь оператор :: разрешает конфликт, предписывая компилятору</b>
<b> // использовать класс CountDown из пространства имен Counter.</b>
<b> Ctr::CountDown cd1 = new Ctr::CountDown(10);</b>
<b> // ...</b>
<b> }</b>
<b>}</b>
В этом варианте программы для класса Counter сначала указывается псевдоним Ctr в следующей строке кода.
<b>using Ctr = Counter;</b>
А затем этот псевдоним используется в методе Main() для дополнительного описания класса CountDown, как показано ниже.
<b>Ctr::CountDown cd1 = new Ctr::CountDown(10);</b>
Описатель :: устраняет неоднозначность, поскольку он явно указывает на то, что следует обратиться к классу CountDown из пространства Ctr, а фактически — Counter. Именно это и делает теперь программу пригодной для компиляции.
Описатель :: можно также использовать вместе с предопределенным идентификатором global для ссылки на глобальное пространство имен. Например, в приведенной ниже программе класс CountDown объявляется как в пространстве имен Counter, так и в глобальном пространстве имен. А для доступа к варианту класса CountDown в глобальном пространстве имен служит предопределенный псевдоним global.
<b>// Использовать псевдоним глобального пространства имен,</b>
<b>using System;</b>