ホームページ >バックエンド開発 >C++ >変数スコープに関するこの C# コードがコンパイルに失敗するのはなぜですか?

変数スコープに関するこの C# コードがコンパイルに失敗するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-12 14:33:43825ブラウズ

Why Does This C# Code About Variable Scope Fail to Compile?

C# 変数のスコープとコンパイルの問題: 詳細な説明

C# の変数スコープは、プログラム内の変数へのアクセス可能性を決定します。 一般的なスコープ関連のコンパイル エラーを説明する 2 つのコード例を見てみましょう。

例 1: コンパイルの失敗

次のコード スニペットはコンパイルに失敗します:

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

    for (int x = 10; x < 20; x++)
    {
        int i = x; // Point 1: Error - Duplicate variable 'i'
        object objX = new object();
        if (x > 15)
        {
            object objX = new string(""); // Point 2: Error - Redeclaration of objX
        }
    }
}</code>

例 1 のエラーの分析

このコードは、2 つの重要な C# スコープ ルールにより失敗します。

  1. スコープ内の一意の変数名: 単一のコード ブロック (中括弧 {} で定義) 内では、同じ名前の 2 つの変数を宣言できません。 ポイント 1 は違反を示しています。int i = x;i ループのブロック内で for を再宣言しており、外部で宣言されている int i = 10; と競合しています。

  2. 一貫した識別子参照: ブロック内では、識別子は一貫して同じエンティティを参照する必要があります。ポイント 2 はこれに違反しています。objXobject として宣言され、その後、ネストされた string ブロック内で if として再宣言されます。 C# では、同じスコープ内でのこのような再定義は許可されません。

例 2: コンパイルの成功

この例は、ネストされたループも使用していますが、正常にコンパイルされます。

<code class="language-csharp">public void MyMethod()
{
    for (int x = 10; x < 20; x++)
    {
        int i = x;
        object objX = new object();
    }
    for (int x = 20; x < 30; x++)
    {
        int i = x;
        object objX = new object();
    }
}</code>

例 2 がコンパイルされる理由

例 2 では、次の理由により前述のエラーが回避されます。

  • 個別のブロック:for ループは、独自の個別のブロックを定義します。 1 つのループ内で宣言された変数は、もう 1 つのループでは表示されません。

  • ブロックごとの一意の識別子: 変数名 (ixobjX) は両方のループで同じですが、別々のスコープに存在するため、別個の変数として扱われます。 .

  • スコープの重複なし: 変数宣言スペースが不正に重複しません。 各変数はそれぞれのループのブロック内にのみ存在するため、競合は発生しません。

要約すると、コンパイル エラーを回避するには、C# の変数スコープ ルールを理解することが重要です。 ブロック内で宣言された変数は、そのブロック内でのみアクセスできます。 同じ名前の変数を再宣言したり、同じスコープ内で一貫性のない識別子を使用したりすると、コンパイルが失敗します。

以上が変数スコープに関するこの C# コードがコンパイルに失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。