簡體   English   中英

C#switch variable initialization:為什么這段代碼不會導致編譯錯誤或運行時錯誤?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM