在方法中使用随机rnd会导致多个错误

时间:2015-01-08 19:17:37

标签: c# random

下面的方法有问题。我得到的当前错误是“它不返回任何值”如果我将返回数字放在括号之外,它在当前上下文中不存在。 如果我一起删除括号,我得到:

嵌入式声明不能是声明或带标签的声明 名称'rnd'在当前上下文中不存在

在没有这个问题之前我已经做过多种方法。我错过了什么?

 public static int generateNumber(int timesUserWantsToGuess)
        {
            for (int i = 0; i <= timesUserWantsToGuess; i++)
            {
                Random rnd = new Random();
                int num = rnd.Next(1, 50);
                return num;
            }


        }

2 个答案:

答案 0 :(得分:6)

首先,你的语义不匹配。您将返回单个int,但正在循环中执行并返回。

如果实际想要返回整个集合,您可以执行以下操作:

public static IEnumerable<int> generateNumber(int timesUserWantsToGuess)
{
   //Optional, but good error checking
   if (timesUserWantsToGuess <= 0)
      throw new ArgumentException("Invalid guess count");

   Random rnd = new Random();
   for (int i = 0; i < timesUserWantsToGuess; i++)
    {
        int num = rnd.Next(1, 50);
        yield return num;
    }
}

请注意使用yield返回序列中的下一个对象。您也不应该在紧密循环中实例化Random,因为它将导致生成相同的值(相同的种子)。此外,在for条件中使用<=将产生比传递值多一次的迭代,因此我切换到<

如果您根本不需要循环,那么只需将其删除即可解决您的问题。目前,循环语义和代码的其余部分不匹配,这导致了问题。

答案 1 :(得分:0)

问题在于,由于return语句存在于循环内,因此编译器假定它有可能在没有命中块的情况下执行,因此不会返回。如果timesUserWantsToGuess小于0,则逻辑上可能发生这种情况 - 在这种情况下循环永远不会进入。如果return语句在块之外,此代码编译的原因是,通过在块之外,执行保证它会在某个时刻点击return(或抛出异常)。

如果您删除C#(ifforforeachlockwhile中某个区块的括号,请执行以下操作你说这个块只包含下一行(按惯例缩进),仅此而已。由于单行(“嵌入”)语句上的变量声明不能在语法上的任何其他地方使用,因此它没有意义,所以编译器完全禁止它。需要注意的是,只要块被括起来,也可以在不使用它的情况下在块中声明变量。

最后,在这样的循环中返回单个值的逻辑存在巨大的语义不匹配:请参阅@ BradleyDotNET对yield return语句的回答