切換聲明在C#中落後?

切換聲明是我喜歡switchif/else if構造的我的主要緣由之一。 這裏有一個例子: 函數

static string NumberToWords(int number)
{
    string[] numbers = new string[] 
        { "", "one", "two", "three", "four", "five", 
          "six", "seven", "eight", "nine" };
    string[] tens = new string[] 
        { "", "", "twenty", "thirty", "forty", "fifty", 
          "sixty", "seventy", "eighty", "ninety" };
    string[] teens = new string[]
        { "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
          "sixteen", "seventeen", "eighteen", "nineteen" };

    string ans = "";
    switch (number.ToString().Length)
    {
        case 3:
            ans += string.Format("{0} hundred and ", numbers[number / 100]);
        case 2:
            int t = (number / 10) % 10;
            if (t == 1)
            {
                ans += teens[number % 10];
                break;
            }
            else if (t > 1)
                ans += string.Format("{0}-", tens[t]);
        case 1:
            int o = number % 10;
            ans += numbers[o];

            break;
        default:
            throw new ArgumentException("number");
    }
    return ans;
}

聰明的人正在畏縮,由於string[]應該在函數以外聲明:嗯,它們是,這只是一個例子。 this

編譯器失敗並出現如下錯誤: spa

Control cannot fall through from one case label ('case 3:') to another
Control cannot fall through from one case label ('case 2:') to another

爲何? 有沒有辦法在沒有三個if的狀況下得到這種行爲? 設計


#1樓

他們更改了c#的switch語句(來自C / Java / C ++)行爲。 我猜想的緣由是人們忘記了墜落而致使的錯誤。 我讀過的一本書說使用goto來模擬,但這聽起來不是一個很好的解決方案。 code


#2樓

每一個case塊後都須要一個諸如break之類的跳轉語句,包括最後一個塊,不管是case語句仍是default語句。 除了一個例外,(與C ++ switch語句不一樣),C#不支持從一個case標籤到另外一個case標籤的隱式降級。 一個例外是case語句沒有代碼。 orm

- C#switch()文檔 three


#3樓

C#不支持使用switch / case語句。 不知道爲何,但實際上沒有它的支持。 連鎖 文檔


#4樓

他們經過設計省略了這種行爲,以免它不被意志使用但引發問題。 get

只有在案例部分中沒有語句時才能使用它,例如: 編譯器

switch (whatever)
{
    case 1:
    case 2:
    case 3: boo; break;
}

#5樓

交換機漏洞歷史上是現代軟件中錯誤的主要來源之一。 語言設計者決定強制要求在案例結束時跳轉,除非您在沒有處理的狀況下直接默認爲下一個案例。

switch(value)
{
    case 1:// this is still legal
    case 2:
}
相關文章
相關標籤/搜索