下面的代码工作正常:

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个不同的类进行类似的操作,这些类都继承自相同的基类,而当我应该使用switch语句时,有10个if/elseif语句很烦人。

最佳答案

ListControl lstMyControl;

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

lstMyControl.CssClass = "SomeClass";

10-06 05:04