2010-02-02 4 views
9

관통 모든 코드 경로를 따를 수 있습니다 이유 :코드가 잘 작동 이하로하지 C# 컴파일러는 switch 문

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 문이 성가신 경우 이와 같은 작업을 몇 번 수행해야합니다.

+0

앞으로 답을 찾아보십시오. 자바는 그런 식으로 물지 않을 것입니다 ... 그리고 나는 C#도 기대하지 않을 것입니다. – Romain

+0

if (SomeVariable = SomeEnum.Value1) <- 대신이 값을 비교해서는 안됩니다. if (SomeVariable == SomeEnum.Value1) –

+3

두 번째 예제에서 (작성된대로), 컴파일러는 실제로'syntax error '('default'가있는 행에 'expected'라고 말합니다.)를 수정하십시오. 'default :'와 presto는 모두 작동합니다. – AakashM

답변

17
ListControl lstMyControl; 

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

lstMyControl.CssClass = "SomeClass"; 
+0

@JeffH, 맞아, 그 코드를 컴파일하면 나에게 효과적이다. C#에서'case default'를'default'와 동일하게 처리했는지 기억이 안납니다. 나는 C#이'case default'에서 컴파일러 에러를 발생시킬 것이라고 상상했을 것입니다. – Earlz

+0

컴파일러 오류 "구문 오류"(''예상 ''기본 '사용되는 컨텍스트에 대해 조금 혼란스러워 – Adrian

+0

와우, 그렇습니다. 그렇다면 OP가 무슨 말을하는 지 궁금하네요? – Earlz

1

"기본"앞에 "대소 문자"를 붙이지 않는 한 (위의 Earlz의 말처럼) 작동합니다. 이 스 니펫은 잘 컴파일됩니다. 나는 당신이보고있는 오류 메시지에 혼란 스럽다. "케이스"를 제거하면 나에게 당신이보고있는 것이 아닌 문법 오류가 생긴다. 다른 일이 있습니까?

ListControl lstMyControl; 

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

lstMyControl.CssClass = "SomeClass";