2012-09-12 49 views
2

我有一個switch語句,如下面的一個:通過switch語句落(作品有時?)

switch (condition) 
{ 
    case 0: 
    case 1: 
     // Do Something 
     break; 
    case 2: 
     // Do Something 
    case 3: 
     // Do Something 
     break; 
} 

我得到一個編譯錯誤告訴我,Control cannot fall through from one case label ('case 2:') to another

嗯......是的,你可以。因爲你正在從case 0:case 1:

事實上,如果我刪除我的case 2:及其相關任務,代碼將編譯並從case 0:case1:

那麼在這裏發生了什麼,以及如何讓我的病例陳述落空並執行一些中間代碼?

回答

10

堆疊標籤和跌落之間存在差異。

C#支持在前:

case 0: 
case 1: 
    break; 

但不落空:

case 2: 
    // Do Something 
case 3: 
    // Do Something 
    break; 

如果你要落空,你需要明確:

case 2: 
    // Do Something 
    goto case 3; 
case 3: 
    // Do Something 
    break; 

的推理是顯而易見的,隱含的落後可能導致不潔的代碼,特別是如果你有多於一行或兩行,並且不清楚如何控制流了。通過強制顯式的穿透,您可以輕鬆地遵循流程。

參考:msdn

+0

另請注意,忘記添加可能導致無意穿透的「break」是很常見的。 – Servy

+0

接受這個答案是最完整的,並且是第一個包含'goto case'的信息,這正是我所期待的。謝謝。 –

+0

感謝您提供正確的goto語法! – Jason

3

引述MSDN:「 C#不支持從一個case標籤通過隱秋到另一個唯一的例外是,如果一個case語句無代碼」

基本上將陳述放入案件並不包括休息是不合法的。

case 1: 
case 2: 
//do stuff 
break; 

是合法

但:

case 1: 
//do stuff without a break 
case 2: 
//do stuff 
break; 

不是。

http://msdn.microsoft.com/en-us/library/06tc147t(v=vs.80).aspx

1

你是不是從case 0下降到case 1,因爲它們共享相同的代碼塊。這與在case 0之前編寫case 1相同。

0

只有在case語句之間沒有代碼的情況下,代碼才能在C#中「通過」。該代碼示例推斷存在情況2和情況3之間的代碼。

0

這是允許

switch (condition) 
{ 
    case 0: 
     // Do Something 
    case 1: 
     // Do Something 
     break; 
} 

這是允許的

switch (condition) 
    { 
     case 0: 
     case 1: 
      // Do Something 
      break; 
    } 
+0

那麼編譯器告訴他,當他嘗試使用他發佈的代碼時... – Servy

+1

@Servy智能編譯器;) –

1

在C#中,可以不通過標籤下降到另一個隱含除非有沒有針對第一個標籤的特定代碼。 你可以有

case 1: 
case 2: 
    // Do Something 
break; 

但不

case 1: 
    // Do Something 
case 2: 
    // Do Something 
break; 

進行更深入的說明,請參見msdn

如果您想明確指出,可以使用goto指令。這也是使用goto並不是一個壞習慣的罕見情況之一。

case 1: 
    // Do Something 
    goto case 2; 
case 2: 
    // Do Something 
break; 
0

問題是,你正在做情況2的東西,然後試圖通過,並且不支持。沒有任何附加活動,你將從0到1。