范围因素如何影响“做……”,而“做……”循环,反之亦然

本文关键字:反之亦然 循环 何影响 影响 范围 | 更新日期: 2023-09-27 18:07:13

c#家庭作业问题:我刚刚使用do-while循环添加了一些"再次播放"逻辑。这是我的原始代码:

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循环的范围内的方法。如果不是作用域问题,那么这是我的幸运猜测。在这种情况下,哪里出了问题?移动那行代码是如何修复的?

范围因素如何影响“做……”,而“做……”循环,反之亦然

你是对的,这是一个范围问题。c#有块作用域,这意味着在块内声明的变量(在{}之间声明的代码)只能在该块(和子块)内部访问。

由于playAgain是在循环体内部定义的,所以它不能在该块之外访问,甚至不能在while表达式中访问。

是的,这是范围问题。do..while的作用域如下

// outer scope
do 
{
    // inner scope
} while (/*outer scope*/);
// outer scope

添加…循环的每次迭代都会破坏在该块中定义的变量,所以当你在条件求值时,它本身在块之外,不知道在内部上下文中定义的playAgain是什么。