2012-03-06 89 views
-2

我想一個JavaScript開關轉換爲C#之一。Switch-Case不能像這樣工作?

我收到錯誤Error 3 Cannot implicitly convert type 'bool' to 'int'

 switch (numero) 
     { 
      case (numero > -1 && numero < 16): 
       rtn = list1[numero] + " " + str2; 
       if (primerDigito != 1) 
       { 
        rtn += "s"; 
       } 
       break; 
      case (numero > 15 && numero < 30): 
       if (numero != 20) 
       { 
        rtn = list2[primerDigito] + list1[segundoDigito]; 
       } 
       else 
       { 
        rtn = "veinte"; 
       } 
       rtn += " " + str2 + "s"; 
       break; 
      case (numero > 29 && numero < 100): 
       rtn = list2[primerDigito] + "nta"; 
       if (segundoDigito != 0) 
       { 
        rtn += " y " + list1[segundoDigito]; 
       } 
       rtn += " " + str2 + "s"; 
       break; 
      case 100: 
       rtn = "cien " + str2 + "s"; 
       break; 
      default: 
       rtn = "número invalido"; 
     } 

是否有變通方法嗎?

注:我真的必須使用開關的情況下(而不是如果,別人的)

+12

你必須解釋**注**,你知道。 – AakashM 2012-03-06 16:03:02

+3

爲什麼*必須*你?這不是C#中case語句的工作方式。 – 2012-03-06 16:04:11

+0

認真??我必須解釋我必須或我得到downvoted ?. Okey,一隻憤怒的熊說,如果我不這樣做,他會來我家吃我...... – mithril333221 2012-03-06 16:08:51

回答

13

您不能這樣做:switch聲明只能使用單個值,而不是case s的範圍。

你需要一個if/else樹來代替。東西的形式:

if(numero > -1 && numero < 16) { 
rtn = list1[numero] + " " + str2; 
if (primerDigito != 1) 
{ 
    rtn += "s"; 
} 
} else if(numero > 15 && numero < 30) { 
// logic in second block 
} else if... 

請注意,如果你是絕對地,完全致力於到使用switch,你將不得不枚舉所有的情況下,(但這是針對軟件工程這樣一個令人震驚的罪惡我甚至不能相信我寫出來 - 不這樣做,這只是一個switch語句是如何工作爲例):

switch(numero) 
{ 
case 0: 
case 1: 
case 2: 
case 3: 
case 4: 
case 5: 
case 6: 
case 7: 
case 8: 
case 9: 
case 10: 
case 11: 
case 12: 
case 13: 
case 14: 
case 15: 
    rtn = list1[numero] + " " + str2; 
    if (primerDigito != 1) 
    { 
    rtn += "s"; 
    } 
    break; 
case 16: 
... 
case 28: 
case 29: 
    // second logic block 
    break; 
... 
} 

如果我看到這在我的代碼庫,不過,我會感到困惑和生氣。

+3

+1這真的是如何解決問題的方法。這是奇怪的,OP是堅持它是「開關」,而不是。 – Yuck 2012-03-06 16:06:58

+5

+1被困惑和生氣 – Rawling 2012-03-06 16:11:06

3

答案,雖然不是你想要的,是你必須使用編譯時常在你case表達式。如果表達式將在運行時間變化,那麼你必須使用代替if..else

此外,case值是一個隱含的邏輯相等比較,不能使用<>

0

不,這不是多麼switch/case作品。 if/else if是正確的選擇。

如下圖所示,您可以堆積case s,但是如果您有這麼多case s,則不是正確的做法。

switch(numero) 
{ 
    case 0: 
    case 1: 
    case 2: 
       and so on 
    case 15: 
     code here 
     break; 
    case 16: 
    case 17: 
       and so on 
    case 29: 
     code here 
     break; 
       and so on 
    case 100: 
     rtn = "cien " + str2 + "s"; 
     break; 
    default:  
     rtn = "número invalido"; 
} 
+1

Bleh,是的。我想我會刪除這個有點贊成先生「困惑和憤怒」。 – Rawling 2012-03-06 16:12:17

0

這是(大部分)不能使用if-else。如果你必須使用一個開關,那麼這就是我知道(讓案件下降到對方)的唯一途徑:

switch (numero) 
{ 
    case 0: 
    case 1: 
    case 2: 
    ... 
    case 15: 
     //Do Stuff 
     break; 
    case 16: 
    ... 
    //Continue as above for each range 
} 
0

不幸的是沒有範圍的switch語句中的支持,你可以,如果其他人使用聲明或你可以這樣做:

case 15: 
    case 16: 
    case 16: 
    case 18: 
// do something 
0

是的,你是完全正確的。在C#中切換語句不會像那樣工作。

實現在C#這樣的邏輯正確的方法是使用一個如,否則如果,else塊。 (是的,我看過你的筆記,但不確定你爲什麼必須使用開關)。

由於各種設計原因,切換語句,如果其他鏈,因爲他們的定義,他們有X的行爲或責任是不鼓勵的。更好的方法是嘗試使用polymorphism的解決方案。你應該將這些行爲重構爲單獨的不同的類,每個類處理一個案例。

相關問題