【发布时间】:2015-04-05 21:37:37
【问题描述】:
所以,我正在编写一个函数,该函数会从字典中随机询问一个问题,直到所有问题都被问完并且我遇到了问题。当随机生成的数字列表已经包含新生成的数字时,程序会调用 Ask 函数,因为它应该这样做。但是,当它到达最后的返回行时,它再次调用函数 Ask,而不是返回数字列表。
static List<int> Ask(Dictionary<string,string> Questions, List<int> random, int count)
{
bool contains = false;
var rando = new Random();
int num = Convert.ToInt32(rando.Next(0, count));
if (random.Count >= count)
{
Console.WriteLine("No more questions! Quitting");
System.Environment.Exit(1);
}
foreach (int number in random)
{
if (number == num)
{
contains = true;
}
}
if (contains == true)
{
Ask(Questions, random, count);
}
random.Add(num);
var randomEntry = Questions.ElementAt(num);
String randomKey = randomEntry.Key;
String randomValue = randomEntry.Value;
Console.WriteLine(randomKey);
if (Console.ReadLine() == randomValue)
{
Console.WriteLine("Correct!");
}
else
{
Console.WriteLine("Wrong!");
}
return random;
}
【问题讨论】:
-
你做了哪些调试来确认这一点?您描述的行为假定您的逻辑必须正确,并且 .NET 运行时本身必须从根本上被破坏。这通常是一个无效的假设。实际上,
return语句确实退出了一个方法。否则,一切都会被破坏。 -
只是在 VS 2013 中进行简单调试。抱歉,如果这不能回答您的问题,我仍在学习。如果有帮助,它会从 if(contains == true) 语句中调用 Ask 函数。
-
在调试器中单步执行代码。如果
contains是true,那么根据您的代码,它应该再次递归调用Ask()函数。那么为什么你会惊讶它正在这样做呢?另外,你为什么不对调用该函数的结果做任何事情? -
我很惊讶,因为它会在到达返回行之后检查 if 语句。
-
没有。它没有。代码按照读取的顺序执行。您一定误解了调试的结果和观察结果。您犯了一个错误的可能性远远远大于整个 .NET 运行时设计错误并且没有人注意到。