2013-12-16 55 views
3

我目前大部分時間都在使用IF語句,但我越來越喜歡switch case語句,因爲它有時更易讀。 但我想知道爲什麼編譯器不瞭解開關以及if。 一個例子:爲什麼SWITCH和IF在變量賦值方面有所不同

bool decision = false; 
IEnumerable<string> toBeAssigned; 

if (decision) 
{ 
    toBeAssigned = getValuesA(); 
} 
else 
{ 
    toBeAssigned = getValuesB(); 
} 

foreach (var elem in toBeAssigned) 
{ 
     // do something 
} 

這應當編譯精細和toBeAssigned可以在foreach沒有問題地使用。

但是:

bool decision = false; 
IEnumerable<string> toBeAssigned; 

switch(decision) 
{ 
    case true:  
    toBeAssigned = getValuesA(); 
    break; 
    case false:  
    toBeAssigned = getValuesB(); 
    break; 
} 

foreach (var elem in toBeAssigned) 
{ 
// do something 
} 

沒有編制,我 - 編譯器會抱怨,對於toBeAssigned值是永遠不會分配。 因爲兩者都應該編譯爲相同的IL,所以我很好奇編譯器爲何不同地處理這兩種情況。

+6

隨着開關編譯器不知道你'case's是面面俱到。它不檢查這個事實。因此,因爲'switch'中沒有'default',所以認爲'toBeAssigned'沒有被賦值時有一種方法。添加'default'而不是'false',它會起作用。 –

+1

稍微偏離主題,關於你引用的具體情況:當switch有兩個以上的潛在選項時'switch'是有意義的,但當只有兩個結果時,我會建議'if'版本更重要可讀。 –

回答

8

您在switch語句中缺少default大小寫。這同樣會發生,如果你寫了:

if (decision) 
{ 
    toBeAssigned = getValuesA(); 
} 
else if (!decision) 
{ 
    toBeAssigned = getValuesB(); 
} 

出現這種情況,是因爲編譯器不知道多少情況下,有始終假定您還沒有涵蓋所有這些,除非你有一個default聲明,基本上是「如果所有其他案例都不符合,就這樣做」。這同樣適用於ifelseif(...)和是你的「的情況:」和else是你的「默認:」

+0

謝謝,我現在明白了區別。這是微妙的,但合乎邏輯... –

11

您的if語句涵蓋了所有可能的情況,但編譯器沒有意識到switch也會這樣做:您錯過了default的情況。

編譯器認爲有可能toBeAssigned可能沒有被設置爲任何東西,所以它會發出錯誤。

+0

非常感謝! –

相關問題