C# 4.0: полное руководство | страница 54



>

>      Console.WriteLine("у равно: " + у); // Здесь всегда выводится -1

>      у = 100;

>      Console.WriteLine("у теперь равно: " + у);

>    }

>  }

>}


Ниже приведен результат выполнения этой программы.


>У равно: -1

>У теперь равно: 100

>У равно: -1

>У теперь равно: 100

>У равно: -1

>У теперь равно: 100


Как видите, переменная у повторно инициализируется одним и тем же значением -1 при каждом входе во внутренний цикл for. И несмотря на то, что после этого цикла ей присваивается значение 100, оно теряется при повторной ее инициализации.

В языке C# имеется еще одна особенность соблюдения правил области действия: несмотря на то, что блоки могут быть вложены, ни у одной из переменных из внутренней области действия не должно быть такое же имя, как и у переменной из внешней области действия. В приведенном ниже примере программы предпринимается попытка объявить две разные переменные с одним и тем же именем, и поэтому программа не может быть скомпилирована.


>/*

>В этой программе предпринимается попытка объявить во внутренней области действия переменную с таким же самым именем, как и у переменной, определенной во внешней области действия.

>*** Эта программа не может быть скомпилирована. ***

>*/

>using System;

>class NestVar {

>  static void Main() {

>    int count;

>    for(count = 0; count < 10; count = count+1) {

>      Console.WriteLine("Это подсчет: " + count);

>      int count; // Недопустимо!!!

>      for(count = 0; count < 2; count++)

>      Console.WriteLine("В этой программе есть ошибка!");

>    }

>  }

>}


Если у вас имеется некоторый опыт программирования на С или C++, то вам должно быть известно, что на присваивание имен переменным, объявляемым во внутренней области действия, в этих языках не существует никаких ограничений. Следовательно, в С и C++ объявление переменной count в кодовом блоке, входящем во внешний цикл for, как в приведенном выше примере, считается вполне допустимым. Но в С и C++ такое объявление одновременно означает сокрытие внешней переменной. Разработчики C# посчитали, что такого рода сокрытие имен может легко привести к программным ошибкам, и поэтому решили запретить его.


Преобразование и приведение типов

В программировании нередко значения переменных одного типа присваиваются переменным другого типа. Например, в приведенном ниже фрагменте кода целое значение типа int присваивается переменной с плавающей точкой типа float.


>int i; float f;

>i = 10;

>f = i; // присвоить целое значение переменной типа float