2010-02-02 4 views
9

dưới đây đang hoạt động tốt:Tại sao không biên dịch C# có thể làm theo tất cả các đường dẫn mã thông qua một câu lệnh switch

ListControl lstMyControl; 

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

lstMyControl.CssClass = "SomeClass"; 

Trong khi các mã dưới đây sẽ không biên dịch:

ListControl lstMyControl; 

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

lstMyControl.CssClass = "SomeClass"; 

Trong ví dụ thứ hai trình biên dịch nói rằng tôi đang cố gắng thiết lập một thuộc tính trên một biến chưa được khởi tạo. Trong cả hai trường hợp, lstMyControl phải được khởi tạo, nhưng compilr dường như không thể theo các đường dẫn mã đó thông qua câu lệnh switch để thấy điều đó. Trong ví dụ đơn giản ở trên tôi sẽ chỉ sử dụng nếu/else. Nhưng có một vài lần khi tôi muốn làm một cái gì đó như thế này với 10 lớp khác nhau mà tất cả kế thừa từ cùng một lớp cơ sở và có 10 câu lệnh if/elseif gây phiền nhiễu khi một câu lệnh switch là thứ tôi nên sử dụng.

+0

Mong chờ câu trả lời ở đó ... Java sẽ không bị cắn theo cách đó ... Và tôi đã mong đợi C# cũng sẽ không. – Romain

+0

if (SomeVariable = SomeEnum.Value1) <- Bạn chắc chắn đây không phải là một sự so sánh thay thế? if (SomeVariable == SomeEnum.Value1) –

+3

Tôi thấy rằng trong ví dụ thứ hai của bạn (như được viết), trình biên dịch thực sự nói 'Lỗi cú pháp, '(' dự kiến' trên dòng nơi bạn có' trường hợp mặc định: '. 'default:' và presto, mọi thứ hoạt động – AakashM

Trả lời

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, yea, chỉ cần biên dịch mã và nó hoạt động cho tôi. Tôi không thể nhớ nếu C# xử lý 'trường hợp mặc định' giống như' mặc định'. Tôi đã có thể tưởng tượng C# sẽ kích hoạt một lỗi trình biên dịch tại 'trường hợp mặc định' thực sự. – Earlz

+0

nó tạo ra lỗi trình biên dịch, "Lỗi cú pháp," ("dự kiến" nó bị nhầm lẫn một chút về ngữ cảnh trong đó 'mặc định' đang được sử dụng – Adrian

+0

Wow, yup nó. Tôi tự hỏi OP nói về cái gì? – Earlz

1

Nó hoạt động miễn là bạn không tiền tố "mặc định" với "trường hợp" (như Earlz đã nói ở trên). Đoạn mã này biên dịch tốt. Tôi đang bối rối bởi các thông báo lỗi bạn đang thấy mặc dù, loại bỏ các "trường hợp" mang lại cho tôi một lỗi cú pháp mà không phải là những gì bạn đang nhìn thấy. Có chuyện gì khác xảy ra không?

ListControl lstMyControl; 

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

lstMyControl.CssClass = "SomeClass";