Почему не может компилятор C# следовать за всеми путями выполнения кода через оператор переключения

Ниже кода хорошо работает:

ListControl lstMyControl;

if (SomeVariable == SomeEnum.Value1)
{
   lstMyControl = new DropDownList();
}
else
{
   lstMyControl = new RadioButtonList();
}

lstMyControl.CssClass = "SomeClass";

Принимая во внимание, что ниже кода не скомпилирует:

ListControl lstMyControl;

    switch (SomeVariable)
    {
       case SomeEnum.Value1:
       lstMyControl = new DropDownList();
       break;
       case default:
       lstMyControl = new RadioButtonList();
       break;
    }

lstMyControl.CssClass = "SomeClass";

Во втором примере в компиляторе говорится, что я пытаюсь установить свойство на переменной, которая не инстанцировали. В любом случае нужно инстанцировать lstMyControl, но compilr, может казаться, не следует за этим пути выполнения кода через оператор переключения для наблюдения этого. В вышеупомянутом простом примере я просто использовал бы если/еще. Но существуют несколько раз, когда я хотел сделать что-то вроде этого с 10 различными классами, которые все наследовали от того же базового класса и наличия 10, если/операторы else if является раздражающим, когда оператор переключения - то, что я должен использовать.

9
задан Earlz 2 February 2010 в 17:30
поделиться

2 ответа

ListControl lstMyControl;

    switch (SomeVariable)
    {
       case SomeEnum.Value1:
       lstMyControl = new DropDownList();
       break;
       default: //Don't prefix with "case"
       lstMyControl = new RadioButtonList();
       break;
    }

lstMyControl.CssClass = "SomeClass";
17
ответ дан 4 December 2019 в 11:41
поделиться

Работает до тех пор, пока вы не префиксируете «по умолчанию» с «чехол» (как говорит Эрлс выше). Этот фрагмент компилирует нормально. Я замешаю сообщение об ошибке, который вы видите, хотя, удаляя «чехол» дает мне синтаксическую ошибку, которая не то, что вы видите. Есть ли еще что-то еще?

ListControl lstMyControl;

int switchVar = 0;
switch (switchVar)
{
    case 1:
        lstMyControl = new DropDownList();
        break;
    default:
        lstMyControl = new RadioButtonList();
        break;
}

lstMyControl.CssClass = "SomeClass";
1
ответ дан 4 December 2019 в 11:41
поделиться
Другие вопросы по тегам:

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