Почему компилятор C # не может следовать всем путям кода через оператор switch - PullRequest
9 голосов
/ 02 февраля 2010

Код ниже работает нормально:

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, но компилятор не может следовать этому пути кода через оператор switch, чтобы увидеть это. В приведенном выше простом примере я бы просто использовал if / else. Но было несколько раз, когда я хотел сделать что-то подобное с 10 различными классами, которые все наследуются от одного базового класса, и наличие 10 операторов if / elseif раздражает, когда оператор switch является тем, что я должен использовать.

Ответы [ 2 ]

17 голосов
/ 02 февраля 2010
ListControl lstMyControl;

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

lstMyControl.CssClass = "SomeClass";
1 голос
/ 02 февраля 2010

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

ListControl lstMyControl;

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

lstMyControl.CssClass = "SomeClass";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...