![](/img/trans.png)
[英]“Use of unassigned local variable” compiler error for switch statement in C#?
[英]C# switch variable initialization: Why does this code NOT cause a compiler error or a runtime error?
...
case 1:
string x = "SomeString";
...
break;
case 2:
x = "SomeOtherString";
...
break;
...
有沒有我不了解C#中的switch語句? 為什么在使用案例2時這不是錯誤?
編輯:此代碼有效,不會拋出錯誤。
你必須小心如何考慮這里的switch
語句。 事實上, 根本沒有創建可變范圍 。 不要僅僅因為案例中的代碼縮進它存在於子范圍內的事實。
當編譯一個開關塊時,只需將case
標簽轉換為標簽,並根據switch表達式在switch語句的開頭執行適當的goto
指令。 實際上,您可以手動使用goto
語句創建“直通”情境(C#直接支持),如MSDN頁面所示。
goto case 1;
如果您特別想在switch
塊中為每個案例創建范圍,則可以執行以下操作。
...
case 1:
{
string x = "SomeString";
...
break;
}
case 2:
{
string x = "SomeOtherString";
...
break;
}
...
這要求您重新聲明變量x
(否則您將收到編譯器錯誤)。 在某些情況下,確定每個(或至少一些)范圍的方法非常有用,並且您肯定會在代碼中不時地看到它。
MSDN上的文檔說:
在switch語句的switch-block中聲明的局部變量的范圍(第8.7.2節)是switch-block。
此外,之前已經提出過類似的問題: c#switch語句中的變量聲明
沒有編譯器錯誤,因為switch語句不會為變量創建新范圍。
如果在開關內部聲明變量,則變量與開關周圍的代碼塊在同一范圍內。 要更改此行為,您需要添加{}:
...
case 1:
// Start a new variable scope
{
string x = "SomeString";
...
}
break;
case 2:
{
x = "SomeOtherString";
...
}
break;
...
這會導致編譯器抱怨。 但是,切換本身並不在內部執行此操作,因此代碼中沒有錯誤。
看起來變量的范圍是在開關內,而不是這種情況,可能是因為案例可以堆疊。 請注意,如果您嘗試在交換機外部引用x,則它將失敗。
如果在case中創建任何局部變量,則不能將它們用於側面案例。
...
int opt ;
switch(opt)
{
case 1:
{
string x = "SomeString";
...
}
break;
case 2:
{
string x = "SomeOtherString";
...
}
break;
default:
{
//your code
}
break;
}
...
將字符串聲明移到之前
switch(value)
聲明。 然后為每個案例分配x。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.