5

C# の宿題の質問: do-while ループを使用して、"play again" ロジックを追加しました。これは私の元のコードでした:

namespace demo
{
    class Program
    {
        static void Main(string[] args)
        {
            Info myInfo = new Info();
            myInfo.DisplayInfo("Daniel Wilson", "4 - Hi-Lo Game");
               // I moved  String playAgain = "N"; to here 
            do
            {
                DWHiLowUI theUI = new DWHiLowUI();
                theUI.Play();
                String playAgain = "N";
                Console.WriteLine("Enter 'Y' to play again, any other key to exit.");
                playAgain = Console.ReadLine();
            }
            while ((playAgain == "Y")||(playAgain =="y"));
            Console.ReadLine();
        }
    }
}

エラーが発生しました:

Error   7   The name 'playAgain' does not exist in the current context

String playAgain = "N";私は私の上の行に移動しましたdo(コメントを参照)、それはうまくいきました。

これを修正するために正確にをしたかを理解しようとしています。スコープの問題のようですが、ループ内で変数を定義すると、ループの最後に変数が渡される可能性があるようにも思えます。教科書に目を通しましたが、ループに関連するスコープについては何もありません。これは、ループ内のスコープは問題ではないことを示唆していますが、これはスコープの問題であるかのように動作しています。私はそれについて考えて混乱しています。

それdo...whileスコープの問題である場合、メソッド内のループのスコープをよりよく理解したいと思います。範囲の問題でなければ、私の幸運な推測でした。その場合、何が間違っていて、そのコード行を移動するとどのように修正されましたか?

4

3 に答える 3

8

おっしゃるとおり、これはスコープの問題です。C# にはブロック スコープがあります。つまり、ブロック内で宣言された変数 ( の間で宣言されたコード{}) は、そのブロック (および子ブロック) 内でのみアクセスできます。

playAgainはループ本体の内部で定義されているため、式の内部であっても、そのブロックの外部にアクセスすることはできませんwhile

于 2013-04-03T00:53:55.943 に答える
6

はい、それは範囲の問題でした。do..while の周りのスコープは次のように機能します

// outer scope
do 
{
    // inner scope
} while (/*outer scope*/);
// outer scope
于 2013-04-03T00:52:47.187 に答える