Добавить в цитаты Настройки чтения

Страница 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>