我在循环之外声明变量setPassword
,然后在循环内给它一个值。然后在下一个do-while循环中,我尝试使用分配的值,但它表示"使用未分配的局部变量"。
profile[I]
是在循环之前创建的对象数组。是否在循环中分配的值未保存,或者profile[I].Password
的值是否为null,因为尚未创建对象?
bool good = false;
string username;
do
{
bool broke = false;
Console.WriteLine("Please create a username");
username = Console.ReadLine();
for (int i = 0; i < profile.Count; i++)
{
if (username == profile[i].Username)
{
Console.WriteLine("The username already exists");
broke = true;
break;
}
}
if (broke == false)
{
good = true;
}
} while (good == false);
Console.WriteLine("Please create a password");
string password = Console.ReadLine();
profile.Add(new Users(username, password, 0));
string setPassword;
bool validUser = false;
do
{
Console.Clear();
Console.WriteLine("Enter your username");
string tryUsername = Console.ReadLine();
for (int i = 0; i < profile.Count; i++)
{
if (profile[i].Username == tryUsername)
{
setPassword = profile[i].Password;
validUser = true;
}
}
if (validUser == false)
{
Console.WriteLine("Invalid username. Usernames are case sensitive");
Thread.Sleep(2500);
}
} while (validUser == false);
bool validPass = false;
do
{
Console.WriteLine("Enter your password");
string tryPass = Console.ReadLine();
if (tryPass == setPassword) //this is the error
{
validPass = true;
}
else
{
Console.WriteLine("Invalid password. Passwords are case sensitive");
}
} while (validPass == false);
答案 0 :(得分:1)
编译器无法知道它实际上会被分配(如果不是所有if
语句都没有被评估为true
)。
分配一个默认值,你会没事的:
string setPassword = null;
答案 1 :(得分:1)
这是因为编译器不能知道你的for
- 循环至少执行一次,特别是循环中的if
- 语句也至少经过一次迭代环。因此 - 至少从编译器的角度来看 - setPassword
可能永远不会赋值,因此您会得到该错误。
在开始时分配null
:
string setPassword = null;
答案 2 :(得分:1)
我在循环之外启动变量setPassword,然后在循环内给它一个值。
这就是问题所在。在使用之前,系统不能保证分配值。
循环可能会迭代0次
周围if
语句的条件也可能评估为false
这两种情况都导致setPassword
永远无法获得价值。
因此,编译器会给您一个错误,您可能在它有值之前使用setPassword
。
解决方法是将其设置为循环外的默认值,并在if
之外。
答案 3 :(得分:0)
基本上问题是:
您在if
语句中使用它们,if
语句使用变量。但是你只是声明但从未定义过全局/本地变量,它会自动给出一个错误,尽管变量将在本地获取用户的输入,但遗憾的是if
语句过于愚蠢而无法为你检测,加上它也是采用用户跳过提供输入的步骤的可能性。因此,您需要设置默认值。
就像他们所说的那样,你可以使用:
string setPassword = null;
或string setPassword = "";
[不需要考虑无效,默认情况下字符串可以是null
]
答案 4 :(得分:0)
要解决您的问题,您应根据用例将setPassword
分配给string.Empty
,null
或其他值
如果你对此感到好奇 - 为什么编译器会抱怨变量未分配,即使你在while循环中为它赋值?
这称为C#语言的 Definite Assignment 行为。如果
,则认为变量是明确赋值的有关详细信息,请参阅Definite assignment at MSDN。它是一个存档文档,但仍然应该是一个很好的参考。 DotNetPerls Page也用简单的语言描述了它。
免责声明:我与DotNetPerls无关。