Shull
@Shull
хочу быть хорошим IT-шником

Почему C# не видит переменную внутри switch?

Есть A и B.
Если A=1, то switch делает B=100 и выводит её на экран.
После этого, я хочу ещё разок вызвать переменную B.
Так не работает :-(
    int a=1;
    int b;
    switch(a){
      case 1:
        b=100;
        Console.WriteLine ("изнутри "+b);
        break;
    }
    Console.WriteLine ("снаружи "+b);


А так - работает! :-)
int a=1;
    int b=5;
    switch(a){
      case 1:
        b=100;
        Console.WriteLine ("изнутри "+b);
        break;
    }
    Console.WriteLine ("снаружи "+b);


Как так?
  • Вопрос задан
  • 685 просмотров
Пригласить эксперта
Ответы на вопрос 2
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Вам четко написали что используется не назначенная переменная. Ткнете по ошибке вас перекинет на нее

9d3a65121b.jpg

int a = 1;
            int b ;
            switch (a)
            {
                case 1:
                    b = 100;
                    Console.WriteLine("изнутри " + b);
                    break;
                default:
                    b = 0;
                    break;
            }
            Console.WriteLine("снаружи " + b);
Ответ написан
В первом варианте
int a=1;
    int b; //не инициализировано
    switch(a){
      case 1:
        b=100;
        Console.WriteLine ("изнутри "+b);
        break;
    }//если a != 1, то b всё ещё не инициализировано
    Console.WriteLine ("снаружи "+b); //<-тут ошибка

Как вариант, если не хочется инициализировать b сразу, то можно добавить ветку default в switch:
int a=1;
    int b;
    switch(a){
      case 1:
        b=100;
        Console.WriteLine ("изнутри "+b);
        break;
       default:
         b = -1;
         break;
    }
    Console.WriteLine ("снаружи "+b);


Ещё я бы посоветовал использовать switch-expression из C# 8 - он сразу исключает такой класс ошибок

var a = 1;
var b = a switch {
   1 => 100,
   _ => -1 // Если не добавить эту ветку, то будет ошибка, что switch-expression покрывает не все возможные варианты
};
//b гарантированно инициализировано
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы