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

C# 在方法中使用随机rnd会导致多个错误,c#,random,C#,Random,下面的方法有问题。我得到的当前错误是它不返回任何值。如果我将return num放在括号外,它在当前上下文中不存在。 如果我将所有支架一起拆下,我会得到: 嵌入语句不能是声明或标记语句 名称“rnd”在当前上下文中不存在 我以前做过很多没有这个问题的方法。我错过了什么 public static int generateNumber(int timesUserWantsToGuess) { for (int i = 0; i <= timesUse

下面的方法有问题。我得到的当前错误是它不返回任何值。如果我将return num放在括号外,它在当前上下文中不存在。 如果我将所有支架一起拆下,我会得到:

嵌入语句不能是声明或标记语句 名称“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;
            }


        }

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

如果您确实想要返回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,因为它会导致相同的值生成相同的种子。另外,使用的问题是,由于return语句存在于循环中,编译器假定它有可能在不命中块的情况下执行,因此不会返回。如果TimeUserWantStoguess小于0,则在逻辑上可能会发生这种情况-在这种情况下,循环永远不会进入。如果return语句在块外,则此代码编译的原因是,通过在块外执行,可以确保它在某个点命中return或抛出异常

如果在C中删除块上的方括号If,for,foreach,lock,而据我所知,所有这些都是这样做的,那么你是在说块只包含下一行,按约定缩进,没有其他内容。由于单行嵌入式语句上的变量声明在语法上不能在其他任何地方使用,因此这样做没有意义,因此编译器完全禁止它。请注意,也可以在块中声明变量而不使用它,只要该块被括起来


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

当timeuserwantstoguess=0时会发生什么?编译器只是拒绝了这种可能性。首先修复第一个错误,然后请搜索错误消息。使用此方法,您试图实现什么目的?如果TimeUserWantStoguess为0,则循环不会返回值。如果TimeUserWantStoguess大于等于1,则循环只执行一次。然后,整个问题都在声明一个新的随机迭代,这将很可能产生相同的随机数。编译器无法知道该值不是传递到此函数的有效值。实际上,如果TimeUserWantStoguess为0,则该值将有一个返回值,但如果它小于零,它将跳过for循环。实际上,只有当timeUserWantsToGuess小于零时,它才会跳过for循环。它可能值得也可能不值得添加timeUserWantsToGuess<0的检查,并抛出InvalidOperationException,而不只是返回一个空序列,因为它感觉这应该是一个严重的错误错误。@MattBurland同意,但我会使用一个例外。作为可选项添加