首頁 >後端開發 >C++ >為什麼 C# 會報告巢狀循環中的變數作用域錯誤,以及「隱形大括號」如何影響此問題?

為什麼 C# 會報告巢狀循環中的變數作用域錯誤,以及「隱形大括號」如何影響此問題?

DDD
DDD原創
2025-01-12 14:02:43797瀏覽

C#嵌套循環中的變數作用域錯誤及解決方法

本文深入探討C#中變數作用域的複雜性,並分析兩個程式碼範例,解釋變數作用域行為引發的疑問。

程式碼範例1

<code class="language-c#">public void MyMethod()
{
    int i = 10;

    for (int x = 10; x < 20; x++)
    {
        int i = x; // Point1: 变量i在此处重新声明
        object objX = new object(); // Point2: 变量objX在此处重新声明
    }
    object objX = new object();
}</code>

正如預期的那樣,由於在for循環內重新聲明了變數i,所以在Point1處報告了一個錯誤。此錯誤源自於一個基本規則,該規則不允許在相同的局部變數宣告空間或嵌套的局部變數宣告空間中使用相同名稱的變數。

然而,Point2處的錯誤可能令人費解。 objX變數是在for循環外部聲明的,但編譯器仍然報告錯誤。這就是「隱式大括號」的概念發揮作用的地方。

在C#中,每個for迴圈都被視為包含在隱式大括號內。因此,在for迴圈外宣告的objX變數被認為在for迴圈體的範圍內。由於在for迴圈內宣告了另一個objX變量,這違反了防止在相同作用域內重複使用變數名稱的規則。

程式碼範例2

<code class="language-c#">public void MyMethod()
{
    for (int i = 10; i < 20; i++)
    {
        // ...
    }
    for (int i = 10; i < 20; i++)
    {
        // ...
    }
    for (int objX = 10; objX < 20; objX++)
    {
        // ...
    }
    for (int objX = 10; objX < 20; objX++)
    {
        // ...
    }
}</code>

在程式碼範例2中,不再有任何編譯器錯誤。這是因為每個for迴圈都有自己的一組隱式大括號,為每個迴圈內的i和objX變數創建了不同的作用域。因此,同名變數僅在其各自for迴圈的隔離作用域內使用,遵守變數作用域規則。

Why Does C# Report Variable Scope Errors in Nested Loops, and How Do

以上是為什麼 C# 會報告巢狀循環中的變數作用域錯誤,以及「隱形大括號」如何影響此問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn