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# スコープ ルールにより失敗します。
スコープ内の一意の変数名: 単一のコード ブロック (中括弧 {}
で定義) 内では、同じ名前の 2 つの変数を宣言できません。 ポイント 1 は違反を示しています。int i = x;
は i
ループのブロック内で for
を再宣言しており、外部で宣言されている int i = 10;
と競合しています。
一貫した識別子参照: ブロック内では、識別子は一貫して同じエンティティを参照する必要があります。ポイント 2 はこれに違反しています。objX
は object
として宣言され、その後、ネストされた 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 つのループでは表示されません。
ブロックごとの一意の識別子: 変数名 (i
、x
、objX
) は両方のループで同じですが、別々のスコープに存在するため、別個の変数として扱われます。 .
スコープの重複なし: 変数宣言スペースが不正に重複しません。 各変数はそれぞれのループのブロック内にのみ存在するため、競合は発生しません。
要約すると、コンパイル エラーを回避するには、C# の変数スコープ ルールを理解することが重要です。 ブロック内で宣言された変数は、そのブロック内でのみアクセスできます。 同じ名前の変数を再宣言したり、同じスコープ内で一貫性のない識別子を使用したりすると、コンパイルが失敗します。
以上が変数スコープに関するこの C# コードがコンパイルに失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。