我正在为课程分配工作而我无法编译。我一直"Use of unassigned local variable"
和multiplierString
获得MultiplcandString
。声明在main的顶部声明,但它似乎没有在while循环中为它们赋值。如果我强制循环外的值,则错误消失。非常感激任何的帮助。感谢。
这里发生了什么?
static void Main()
{
bool goodInput = false;
ConsoleKeyInfo cki;
string multiplicandString;
string multiplierString;
string endProduct;
string prompt;
string response;
Int64 TryNumber;
prompt = "This program will multiply two numbers of reasonable length.";
Console.WriteLine(prompt);
Console.WriteLine();
prompt = "Press the Escape (Esc) key to quit or any other key to continue.";
cki = Console.ReadKey();
if (cki.Key != ConsoleKey.Escape)
{
while (!goodInput)
{
prompt = "Please provide the multiplicand: ";
Console.WriteLine(prompt);
response = Console.ReadLine();
if (Int64.TryParse(response, out TryNumber))
{
goodInput = true;
multiplicandString = "a"; //TryNumber.ToString();
}
else
{
Console.WriteLine();
prompt = "Invalid multiplicand entry. It must be all numbers.\a";
Console.WriteLine(prompt);
prompt = "Please try again.";
Console.WriteLine(prompt);
} // end if Int64.TryParse
} // end while ! goodInput
goodInput = false;
while (!goodInput)
{
prompt = "Please provide the multiplier: ";
Console.WriteLine(prompt);
response = Console.ReadLine();
if (Int64.TryParse(response, out TryNumber))
{
goodInput = true;
multiplierString = "a"; //TryNumber.ToString();
}
else
{
Console.WriteLine();
prompt = "Invalid multiplier entry. It must be all numbers.\a";
Console.WriteLine(prompt);
prompt = "Please try again.";
Console.WriteLine(prompt);
} // end if Int64.TryParse
} // end while ! goodInput
//multiplierString = "a"; //TryNumber.ToString();
endProduct = MultiplyByRectangle(multiplicandString, multiplierString);
Console.WriteLine("The result of the calculation is:");
Console.WriteLine("\t" + endProduct);
} // end Main()
答案 0 :(得分:2)
C#需要明确分配变量。意思是,变量必须先设置为初始值才能读取。
答案 1 :(得分:1)
在C#中,必须在第一次读取操作之前明确分配局部变量。在你的情况下,几个变量只在一个循环中初始化,而循环并不是绝对肯定会运行。
如果用户立即按下Esc
键,这些变量真的会被取消分配,不是吗?
答案 2 :(得分:0)
您收到错误,因为编译器无法确定您是否将进入while循环。您可以为它们分配一些默认值,例如`null;
string multiplicandString = null;
string multiplierString = null
答案 3 :(得分:0)
在这种情况下,编译器无法猜测您声明的变量将被赋值。
如果它没有进入循环,即使它只移动到else块,该怎么办。
由于这些不能在编译时评估,因此它提供了最佳反馈
因此最好初始化所有变量,例如
string multiplicandString ="";
string multiplierString ="";
答案 4 :(得分:0)
试试这个:
string multiplicandString = string.Empty;
string multiplierString = string.Empty;
答案 5 :(得分:0)
您遇到的问题是编译器没有证明存在为这些变量分配的值。我不同意其他建议用null或空和变异初始化的答案。
如果你将两个while循环拉入它们自己的函数,返回字符串,你可以在声明它们时初始化它们。
答案 6 :(得分:-1)
TryParse
成功后,multiplierString
分配。但是当输入无效时,else
分支会运行,而multiplierString
不会分配。然后在else
块multiplierString
被读取之后。这是非法的。