Ниже кода хорошо работает:
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 является раздражающим, когда оператор переключения - то, что я должен использовать.
ListControl lstMyControl;
switch (SomeVariable)
{
case SomeEnum.Value1:
lstMyControl = new DropDownList();
break;
default: //Don't prefix with "case"
lstMyControl = new RadioButtonList();
break;
}
lstMyControl.CssClass = "SomeClass";
Работает до тех пор, пока вы не префиксируете «по умолчанию» с «чехол» (как говорит Эрлс выше). Этот фрагмент компилирует нормально. Я замешаю сообщение об ошибке, который вы видите, хотя, удаляя «чехол» дает мне синтаксическую ошибку, которая не то, что вы видите. Есть ли еще что-то еще?
ListControl lstMyControl;
int switchVar = 0;
switch (switchVar)
{
case 1:
lstMyControl = new DropDownList();
break;
default:
lstMyControl = new RadioButtonList();
break;
}
lstMyControl.CssClass = "SomeClass";