2017-07-20 3 views
-1
namespace project1 
{ 
    public class testclass 
    { 
     int i = 0; 

     public int foobar() 
     { 
      int i = 1; 
      return i; 
     } 
    } 
} 

結果:Ne-stead/same Scope内で同じ名前の変数を複数回宣言することは可能ですか?

私はi変数の2倍を宣言しています。なぜ私はこれを許しているのですか?

私は同じスコープで宣言しようとすると、コンパイラは私に例外を与えるでしょうなぜ入れ子スコープで許可するのですか?

+5

を。ローカル変数とスコープについて読む –

+0

*なぜあなたにこれがあなたにエラーをもたらすと思いますか? –

+0

'if'には独自のスコープがあります(スコープにもアクセスできます)。これは多くのプログラミング言語には – UnholySheep

答えて

3

これには重なりがないthis.iでいつでもアクセスすることができ、クラスの宣言のバグ

あなたのフィールドint iではありません。実際、これは実際には、camelCaseのメソッド内にフィールド名、パラメータ、ローカル変数を(個人的に)書き込むための規約です。一方、プロパティ、メソッド名、クラス名などはPascalCaseで書かれています。

クラスのiフィールドにアクセスする場合は、this.iと書くことができます。それ以外の場合は、ifブロック内にある限り、変数iのスコープにアクセスします。

namespace Project1 // PascalCase here for namespace name 
{ 
    public class TestClass // Again PascalCase for class name. 
    { 
     int i = 0; // camelCase correct here for field name. 

     public void Foobar() // PascalCase for method name. 
     { 
      if (0 == 0) 
      { 
       int i = 0; // camelCase correct here for local variable name. 
          // Cannot be re-declared until your if-block is finished. 

       // accessing both elements named 'i' 
       this.i = i; 
      } 

     return; 
     } 
    } 
} 

Microsoft docsを参照してください。

0

特定のスコープで宣言されたすべての変数は一意でなければなりません。

いくつかの変数はデータ型によって再利用できますが、変数を再利用する必要があるかどうかは、実行していることによって異なります。

あなたのコードが動作することができますが、それはすでにあなたの代わりに変数を再作成しようとし、その値を変更する必要が0

の値が存在するとして、あなたがiに間違っている第二の時間を宣言している:

namespace project1 
{ 
    public class testclass 
    { 
     int i = 0; 

     public void foobar() 
     { 
      if (0 == 0) 
      { 
       i = 0; 
      } 

      return; 
     } 
    } 
} 

また、新しい変数を作成できます。これは、C#のバグではありません

namespace project1 
{ 
    public class testclass 
    { 
     int i = 0; 

     public void foobar() 
     { 
      if (0 == 0) 
      { 
       int j = 0; 
      } 

      return; 
     } 
    } 
} 
+1

"は間違っています[...]" < - 間違って – Mischa

+0

OPは変数を再作成しません。 'foobar'メソッドの中で、さらにローカル変数が生成されます。これは完全に合法です。私はMischaに同意します。あなたが誤っていると言ったときは間違っています。 –

+0

@ミッシェーバック私が間違っている場合は、自分自身を私だけでなく、この答えを見て私を訂正するすべての人にも役立つようにしてください。 OPが問題を抱えているのは、彼が 'if'ステートメントで' i'という新しい整数を宣言しようとしているからですが、 'i'もグローバルフィールドとして宣言しているので、' i'はすでにifステートメント。 – Ortund

関連する問題