对指定的字符串使用未分配的局部变量错误

时间:2016-03-01 17:52:36

标签: c# variables

所以,我是C#的初学者,我真的不知道为什么我为变量“name”获得了“使用未分配的局部变量错误”。我有这个简单的代码要求输入名称,如果它不是Bob或Alice,它会显示一条消息。

using System;

namespace exercise2
{
    class Program
    {
        static void Main(string[] args)
        {
            string name;
            int i = 0;
            while (i == 0)
            {
                Console.Write("What is your name?\n>>> ");
                name = Console.ReadLine();
                if ((name == "Alice") || (name == "Bob"))
                {
                    i = 1;
                    Console.Clear();
                }
                else
                {

                    Console.WriteLine("You're not Alice or Bob.");
                    Console.ReadKey();
                    i = 0;
                    Console.Clear();
                }

            }
            Console.WriteLine("Good Morning, " + name); //"name" is unassigned
            Console.ReadKey();
        }
    }
}

希望这不是一个愚蠢的问题。

由于

2 个答案:

答案 0 :(得分:2)

这是因为编译器不能"看到"对while()语句的评估肯定会true,而name将首次在while块中进行评估。

更改您的

string name;

string name = ""; //or string.Empty

虽然作为人类,我们可以轻松阅读while块将首次执行:

string name; //unassigned
int i = 0;
while (i == 0) //will enter
{
    Console.Write("What is your name?\n>>> ");
    name = Console.ReadLine(); //name will definitely be assigned here
    ... something else
}
Console.WriteLine("Good Morning, " + name); //compiler cannot "see" that the while loop will definitely be entered and name will be assigned. Therefore, "name" is unassigned

编译器无法看到,从而导致错误。

或者,您也可以将while块更改为do-while,以强制编译器看到name将被分配(Credit转到Lee):< / p>

string name; //unassigned
int i = 0;
do //will enter
{ 
    Console.Write("What is your name?\n>>> ");
    name = Console.ReadLine(); //name will definitely be assigned here
    ... something else
} while (i == 0);
Console.WriteLine("Good Morning, " + name); //should be OK now

答案 1 :(得分:1)

name变量在分支过程中的某个时刻未被分配,可以使用它。您可以为其分配默认值,但重构它是一个更好的解决方案。

在while循环中移动name变量以避免重新分配。 (在技术上将它放在while循环中不会重新分配同一个变量,因为当它再次循环时,会创建一个新变量并且之前的设置值不可用)。

将以下两行移动到条件的真实部分:

{{1}}