在方法中使用随机 rnd 会导致多个错误
Using random rnd inside a method causes multiple errors
下面的方法有问题。我得到的当前错误是 "it does not return any value" 如果我将 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;
}
}
首先你的语义不匹配。您正在 returning 单个 int
,但正在循环中执行和 returning。
如果你实际上想要return一个集合整数,你可以这样做:
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
到 return 序列中的下一个对象。您也不应该在紧密循环中实例化 Random
,因为它会导致生成相同的值(相同的种子)。此外,在 for 条件中使用 <=
将产生比传递值多一次的迭代,因此我切换到 <
.
如果您根本不需要循环,那么只需将其删除,您的问题就会得到解决。目前,循环语义和您的代码的其余部分不匹配,这导致了您的问题。
问题在于,由于 return
语句存在于循环中,编译器假定它有可能在不碰到块的情况下执行,因此不会 return。如果 timesUserWantsToGuess
小于 0,这在逻辑上会发生——在这种情况下,循环永远不会进入。如果 return
语句在块外,则此代码编译的原因是,通过在块外,执行保证它会在某个时候命中 return
(或抛出异常)。
如果在 C# 中删除块上的括号(if
、for
、foreach
、lock
和 while
都这样做以我的知识)你是说该块仅包含下一行(按照惯例缩进),仅此而已。由于单行 ("embedded") 语句中的变量声明在语法上不能用于其他任何地方,因此这样做没有意义,因此编译器完全禁止它。请注意,也可以在块中声明一个变量而不使用它,只要块被括起来。
最后,在像这样的循环中 returning 单个值的逻辑中存在巨大的语义不匹配:请参阅@BradleyDotNET 对 yield return
语句
的回答
下面的方法有问题。我得到的当前错误是 "it does not return any value" 如果我将 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;
}
}
首先你的语义不匹配。您正在 returning 单个 int
,但正在循环中执行和 returning。
如果你实际上想要return一个集合整数,你可以这样做:
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
到 return 序列中的下一个对象。您也不应该在紧密循环中实例化 Random
,因为它会导致生成相同的值(相同的种子)。此外,在 for 条件中使用 <=
将产生比传递值多一次的迭代,因此我切换到 <
.
如果您根本不需要循环,那么只需将其删除,您的问题就会得到解决。目前,循环语义和您的代码的其余部分不匹配,这导致了您的问题。
问题在于,由于 return
语句存在于循环中,编译器假定它有可能在不碰到块的情况下执行,因此不会 return。如果 timesUserWantsToGuess
小于 0,这在逻辑上会发生——在这种情况下,循环永远不会进入。如果 return
语句在块外,则此代码编译的原因是,通过在块外,执行保证它会在某个时候命中 return
(或抛出异常)。
如果在 C# 中删除块上的括号(if
、for
、foreach
、lock
和 while
都这样做以我的知识)你是说该块仅包含下一行(按照惯例缩进),仅此而已。由于单行 ("embedded") 语句中的变量声明在语法上不能用于其他任何地方,因此这样做没有意义,因此编译器完全禁止它。请注意,也可以在块中声明一个变量而不使用它,只要块被括起来。
最后,在像这样的循环中 returning 单个值的逻辑中存在巨大的语义不匹配:请参阅@BradleyDotNET 对 yield return
语句