Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#对象引用未设置为对象?_C# - Fatal编程技术网

C#对象引用未设置为对象?

C#对象引用未设置为对象?,c#,C#,publicstaticvoidduel(字符串用户、字符串用户1、字符串用户2) { int[]值=null; 弦乐冠军; 对于(int i=0;i值[1]) { 获胜者=用户1; } 其他的 { 获胜者=用户2; } WriteLine(user+“开始与”+user1+“和”+user2+“!”)决斗; Console.WriteLine(user1+“rolled”+值[0]+“和”+user2+“rolled”+值[1]+“!”); Console.WriteLine(winner+“

publicstaticvoidduel(字符串用户、字符串用户1、字符串用户2)
{
int[]值=null;
弦乐冠军;
对于(int i=0;i<2;i++)
{
Random rand=新随机((int)DateTime.Now.Ticks);
int numIterations=0;
numIterations=rand.Next(2,12);
值[i]=numIterations;//这是第286行
}
如果(值[0]>值[1])
{
获胜者=用户1;
}
其他的
{
获胜者=用户2;
}
WriteLine(user+“开始与”+user1+“和”+user2+“!”)决斗;
Console.WriteLine(user1+“rolled”+值[0]+“和”+user2+“rolled”+值[1]+“!”);
Console.WriteLine(winner+“是赢家!”);
}
这里到底出了什么问题?当我设置
int[]value=null
时,它会编译,但如果我删除null,它会显示
使用未分配的局部变量“value”第286行
将该行更改为:

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!");
        }

您需要创建一个空数组,以便以后可以使用它

如果未将其设置为任何值,则会使用未分配的局部变量,因为您已经声明了该变量,但没有给它一个值

如果您将它设置为null,那么这就给了它一个值,但您也没有在该变量中放入任何内容。下面的代码希望能够使用元素0和1,但是,尽管您声明
value
是一个数组,但尚未创建要放入变量的数组,因此在尝试访问不存在的数组的元素时会出现错误

上面的代码通过将变量设置为一个包含2个元素的数组来解决这个问题,该数组将包含数组中类型的默认值(
int
),在本例中,该值将是
0
,直到将它们设置为某个值为止


错误的模拟时间:

想象一下,我正计划在卧室里放一个书架。我为它留出了空间(声明变量),但我没有在该空间中放置书架(将变量设置为null,或者根本不设置它)

如果我在第二个架子上拿东西,我显然会遇到问题,因为尽管我在房间(我的程序)中留出了空间(一个变量),但我没有在那里放书架(声明一个数组放入变量)



有关更多信息,请参见。

您正在引用值[i],但尚未实际初始化值[]。 你需要像这样做

int[] value = new int[2];

是的,在使用
value
变量之前,您必须为该变量指定一个值,但是当您将其设置为null时,当您尝试使用它时,将得到
NullReferenceException
。看起来您需要一个两元素数组,所以使用

value = new int[2];
但是,使用您编写的代码,您几乎肯定会得到两个值相同的结果,因为您几乎同时创建了两个
Random
实例。有关更多信息,请参阅我的

我会将一个
Random
实例传递到该方法中,然后像这样重写它-而不需要一些毫无意义的循环:

int[] value = new int[2];
注意事项如下:

  • 我们的方法依赖于它自身不一定能够正确创建的东西(随机的),因此被注入
  • 通过滚动两个骰子来模拟滚动两个骰子(这是我假设的目标),而不是均匀地拾取范围
    [2,12]
    中的单个数字
  • 第二个参数是一个排他性上界(在我检查它之前我弄错了)
  • 如果要根据条件选取一个表达式或另一个表达式,并对结果执行相同的操作,请使用条件运算符
  • 使用使格式化字符串比简单的串联更容易
  • 遵循.NET命名约定(
    Duel
    ,而不是
    Duel
    • 在c语言中,您需要将变量初始化为某个值,否则它将无法编译。要修复运行时错误,需要将值初始化为数组(而不是null)。由于要循环两次值,我假设您需要执行以下操作:

      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);
      }
      

      您需要在某处创建阵列:

      int[] value = new int[2];
      

      您尚未为
      int[]
      分配实例。如果您知道始终有2个值,则可以使用:

      int[] value = new int[2];
      

      如果你不知道你只有2个值,请考虑使用一个列表:

      int[] value = new int[2];
      
      列表值=新列表();
      
      如果您刚开始声明数组,您应该是安全的

      List<int> value = new List<int>();
      

      别误会,但你介意告诉他为什么要这么做吗?显然,他需要学习如何正确创建更高级变量实例的基础知识(与string、int等相比)谢谢你的邀请answer@GeorgeDuckett是的,是的。但是有点慢,因为小键盘上有大手指。哇,我也有同样的数字问题。我打算用睡眠来修复它(100);但是谢谢你给我看你的两个骰子@凯尔:小心-我刚刚修正了我的答案,因为我把对
      Random.Next的调用搞砸了。检查编辑。感谢Jon提供的详细答案和注释。
      
      int[] value = new int[2];