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

本文关键字:错误 rnd 方法 随机 | 更新日期: 2023-09-27 18:36:43

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

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

        }

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

首先,

你的语义不匹配。您正在返回单个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 条件中使用 <= 将产生比传递的值多一次迭代,所以我切换到 < .

如果您根本不想要循环,那么只需删除它,您的问题就会得到解决。目前,循环语义和其余代码不匹配,这导致了问题。

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

如果你在 C# 中删除块上的括号(ifforforeachlock ,并且据我所知while都这样做),你说该块只包含下一行(按约定缩进),仅此而已。由于单行("嵌入式")语句上的变量声明不能在语法上在其他任何地方使用,因此这样做没有意义,因此编译器完全禁止它。请注意,也可以在不使用它的情况下在块中声明变量,只要块被括起来即可。

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