6

重複の可能性:
子スコープとCS0136
C#変数スコープ

私はかなり長い間C#を使用していますが、このエラーに遭遇したばかりです。

私が以下を持っている場合:

if(true)
{
    int x = 0;
}
int x = 0;

次のようなエラーが発生します。A local variable named 'x' cannot be declared in this scope because it would give a different meaning to 'x', which is already used in a child scope to denote something else.

そして私がこれを行う場合:

if(true)
{
    int x = 0;
} 
x = 0;

次のようなエラーが発生します。The name 'x' does not exist in the current context.

どちらか一方があることは理解できますが、なぜこれらのエラーの両方が存在するのですか?最初のオプションを回避する方法はありますか?とても迷惑だと思います。

ありがとう。

4

2 に答える 2

6

これらのエラーはどちらも、間違いを犯したり、同僚があなたを殺したいと思ったりするのを防ぐために存在します.

最初の例は、同じ名前のローカル変数を 2 つ同時にスコープに持つと混乱するため、失敗します。

変数のスコープがifステートメントであり、そのスコープ外にアクセスしようとしているため、2 番目は失敗します。

ブロックの内外で使用できる単一の変数が必要な場合は、ブロックの前に宣言するだけです。

int x;
if (true)
{
    x = 0;
}
x = 0;

実際に 2 つの別々の変数を同時に (ブロック内で) スコープに入れたい場合は、それらに異なる名前を付けます。これにより、後で混乱するのを回避できます。

編集:単一のメソッドで同じ名前の複数のローカル変数を宣言できますが、それらは別々のスコープを持つ必要があります。例えば:

public void Foo(IEnumerable<string> values)
{
    double sum = 0;
    foreach (string x in values)
    {
        int z = x.Length;
        sum += z;
    }

    foreach (string x in values)
    {
        double z = double.Parse(x);
        sum += z;
    }
}

個人的には、変数に意味のある名前があり、メソッドが短い場合、この機能を頻繁に使用する傾向はありません。少なくとも異なる型では使用しません。しかし、それは絶対に合法であり、確かに役立つ場合があります。

于 2012-01-19T21:12:25.553 に答える
3

最初のケースの問題はint x、ブロックの外側に{ }、コンテキストを内側に囲むグローバルスコープがあること{ }です。したがって、同じ名前の変数を再宣言しています。

2番目のケースでは; x内部でのみ定義されているため存在しません{ }

于 2012-01-19T21:12:10.973 に答える