所以,我是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();
}
}
}
希望这不是一个愚蠢的问题。
由于
答案 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}}