C# switch case поведение для объявленных vars [дубликат]


На этот вопрос уже есть ответ здесь:

Я немного запутался в использовании терминов в условиях switch-case. Почему c# принимает все в case объявленных переменных и объявляет их автоматически в верхней части оператора switch?

Для пример:

switch (test)
{
    case "hello":
        string demo = "123";
        break;

    case "world":
        demo = "1234";
        break;

    // not working
    case "hello world":
        demo = demo + "1234567";
        break;
}

Я могу назначить переменную demo под case "world", Даже если она объявлена под case "hello. Но c#, по-видимому, только объявляет значение и не устанавливает никакого значения, потому что получение и настройка значения (см. раздел case "hello world") невозможны.

Почему c# не открывает терм / область для каждого case-блока и не закрывает его простым разрывом или возвратом?

1   3   2015-07-29 13:30:10

1 ответ:

Потому что вы не начинаете новую область. Лично я почти исключительно использую области блоков в своих заявлениях case:

switch (test)
{
    case "hello":
    {
        string demo = "123";
        break;
    }
    case "world":
    {
        var demo = "1234";
        break;
    }
    case "hello world":
    {
        var demo = 34;
        break;
    }
}

На мой взгляд, основными причинами этого являются 1) простота и 2) совместимость с C. уже существует синтаксис для запуска новой области блока, и это использование { ... }. Не нужно добавлять еще одно правило "просто так". В C# нет особого смысла в том, чтобы не иметь отдельную область для каждого из операторов case, поскольку вам запрещено читать возможно, неназначенные переменные.

Например, в C#не допускается следующее:

switch (test)
{
  case 1: string demo = "Hello"; goto case 2;
  case 2: demo += " world"; break;
}

Конечно, решение этой проблемы довольно простое - просто объявите local за пределами области switch и дайте ему значение по умолчанию, если это необходимо.