public static void duel(String user, String user1, String user2)
{
int[] value = null;
String winner;
for (int i = 0; i < 2; i++)
{
Random rand = new Random((int)DateTime.Now.Ticks);
int numIterations = 0;
numIterations = rand.Next(2, 12);
value[i] = numIterations;//This is line 286
}
if (value[0] > value[1])
{
winner = user1;
}
else
{
winner = user2;
}
Console.WriteLine(user + " Started a duel against " + user1 + " and " + user2 + "!");
Console.WriteLine(user1 + " rolled " + value[0] + " and " + user2 + " rolled " + value[1] + "!");
Console.WriteLine(winner + " is the winner!");
}
这到底出了什么问题?当我设置int[] value = null
时,它会编译,但如果我删除null,则会显示Use of unassigned local variable 'value' Line 286
答案 0 :(得分:9)
是的,您必须在使用之前为value
变量指定一个值 - 但是当您将其设置为null时,将获得NullReferenceException
当你尝试使用它时。看起来你想要一个双元素数组,所以使用
int[] value = new int[2];
但是,使用您编写的代码,您几乎肯定最终会得到两个值相同,因为您在几乎完全相同的时间创建了两个Random
实例< / em>的。有关详细信息,请参阅我的article on Random
。
我会将Random
实例传递给方法,并像这样重写它 - 没有一点点无意义的循环:
public static void Duel(Random rng, String user, String user1, String user2)
{
// Using Next(2, 12) doesn't really mimic 2 dice of 1-6; it actually mimics
// a single 10-sided die with values 2 to 11 inclusive.
int score1 = rng.Next(1, 7) + rng.Next(1, 7);
int score2 = rng.Next(1, 7) + rng.Next(1, 7);
// Note: this is biased in favour of user2 in case of equality
string winner = score1 > score2 ? user1 : user2;
Console.WriteLine("{0} started a duel between {0} and {1}!",
user, user1, user2);
Console.WriteLine("{0} rolled {1} and {2} rolled {3}!", user1, score1,
user2, score2);
Console.WriteLine("{0} is the winner!", winner);
}
此处需要注意的事项:
Random
),因此会被注入。[2, 12]
范围内的单个数字。Random.Next
的第二个参数是独占上限(在我检查之前我弄错了)Duel
,而不是duel
)答案 1 :(得分:5)
将行更改为:
int[] value = new int[2];
您需要创建一个空数组,以便以后可以使用它。
如果你没有将它设置为Use of unassigned local variable
,那么你已经声明了变量,但没有给它一个值。
如果你将它设置为null然后给它一个值,但你也没有在该变量中添加任何内容。您的代码进一步向下期望能够使用元素0和1,但是虽然您声明value
是一个数组,但您没有创建要放入变量的数组,因此在尝试访问时会出现错误不存在的数组的元素。
上面的代码通过将变量设置为带有2个元素的数组来修复此问题,该数组将包含数组中类型的默认值(int
),在本例中为0
,直到你将它们设置为等于某种东西。
糟糕的比喻时间:
想象一下,我打算在我的卧室里放一个书架。我为它腾出空间(声明变量),但是我没有在那个空间放一个书架(将变量设置为null,或者根本不设置它)。
如果我去第二个货架上买东西,我显然会遇到问题,因为虽然我在我的房间里(我的程序)已经制作了空间(一个变量)但我没有把书架放在那里(宣布一个数组进入变量)。
有关详细信息,请参阅Arrays Tutorial on MSDN。
答案 2 :(得分:3)
您正在引用值[i],但您还没有实际初始化值[]。 你需要做一些像
这样的事情value = new int[2];
答案 3 :(得分:2)
您尚未为int[]
分配实例。如果您知道总会有2个值,则可以使用:
int[] value = new int[2];
如果您不知道自己只有2个值,请考虑使用List:
List<int> value = new List<int>();
答案 4 :(得分:0)
在c#中,您需要将变量初始化为某个值,否则将无法编译。要修复运行时错误,需要将值初始化为数组(而不是null)。由于你循环遍历值两次,我认为你需要做这样的事情:
int[] value = new int[2];
答案 5 :(得分:0)
您需要在某处创建阵列:
int[] value = new int[2];
答案 6 :(得分:0)
如果您只是在开头声明数组,那么您应该是安全的。
int[] value = new int[2];