我目前大部分時間都在使用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,所以我很好奇編譯器爲何不同地處理這兩種情況。
隨着開關編譯器不知道你'case's是面面俱到。它不檢查這個事實。因此,因爲'switch'中沒有'default',所以認爲'toBeAssigned'沒有被賦值時有一種方法。添加'default'而不是'false',它會起作用。 –
稍微偏離主題,關於你引用的具體情況:當switch有兩個以上的潛在選項時'switch'是有意義的,但當只有兩個結果時,我會建議'if'版本更重要可讀。 –