C# 将数组传递给存储过程时的Null引用

C# 将数组传递给存储过程时的Null引用,c#,sql,unit-testing,C#,Sql,Unit Testing,我得到以下错误: System.NullReferenceException:对象引用未设置为对象的实例 当我尝试运行此单元测试时: [TestMethod] public void TestDecreaseTutorArea() { HelpWith info = new HelpWith(); info.Subcategories[0] = 1; info.UserId = 14; TutorServi

我得到以下错误:

System.NullReferenceException:对象引用未设置为对象的实例

当我尝试运行此单元测试时:

    [TestMethod]
    public void TestDecreaseTutorArea()
    {
        HelpWith info = new HelpWith();
        info.Subcategories[0] = 1;
        info.UserId = 14;

        TutorService tutorService = new TutorService();

        tutorService.DecreaseTutorArea(info);
    }
HelpWith
类如下所示:

public class HelpWith
{
    public int UserId { get; set; }
    public int[] Categories { get; set; }
    public int[] Subcategories { get; set; }
}

有人知道我做错了什么吗?在我看来,我已经非常清楚地说明了
信息子类别是什么。

您尚未将数组初始化为任何大小。您正在尝试访问该元素

 info.Subcategories[0] = 1;
这就是为什么你会得到例外

在使用构造函数之前或在构造函数中初始化它们到某个大小

public void TestDecreaseTutorArea()
    {
        HelpWith info = new HelpWith();
        info.SubCategories = new int[10]; //here
        info.Subcategories[0] = 1;
        info.UserId = 14;

        TutorService tutorService = new TutorService();

        tutorService.DecreaseTutorArea(info);
    }
或在类构造函数中:

public class HelpWith
{
    public int UserId { get; set; }
    public int[] Categories { get; set; }
    public int[] Subcategories { get; set; }
    //constructor
    public HelpWith()
    {
      this(10,10);
    }

    public HelpWith(int CategorySize, int SubCategorySize)
    {
     Categories = new int[CategorySize]; //some size
     SubCategories = new int[SubCategorySize];
    }
}
如果您之前不知道数组的大小,请使用
List
,但请记住在构造函数中初始化它,如:

public class HelpWith
{
    public int UserId { get; set; }
    public List<int> Categories { get; set; }
    public List<int> Subcategories { get; set; }
    //constructor
    public HelpWith()
    {
        Categories = new List<int>();
        Subcategories = new List<int>();
    }
}

您尚未将数组初始化为任何大小。您正在尝试访问该元素

 info.Subcategories[0] = 1;
这就是为什么你会得到例外

在使用构造函数之前或在构造函数中初始化它们到某个大小

public void TestDecreaseTutorArea()
    {
        HelpWith info = new HelpWith();
        info.SubCategories = new int[10]; //here
        info.Subcategories[0] = 1;
        info.UserId = 14;

        TutorService tutorService = new TutorService();

        tutorService.DecreaseTutorArea(info);
    }
或在类构造函数中:

public class HelpWith
{
    public int UserId { get; set; }
    public int[] Categories { get; set; }
    public int[] Subcategories { get; set; }
    //constructor
    public HelpWith()
    {
      this(10,10);
    }

    public HelpWith(int CategorySize, int SubCategorySize)
    {
     Categories = new int[CategorySize]; //some size
     SubCategories = new int[SubCategorySize];
    }
}
如果您之前不知道数组的大小,请使用
List
,但请记住在构造函数中初始化它,如:

public class HelpWith
{
    public int UserId { get; set; }
    public List<int> Categories { get; set; }
    public List<int> Subcategories { get; set; }
    //constructor
    public HelpWith()
    {
        Categories = new List<int>();
        Subcategories = new List<int>();
    }
}
错误发生在这里

[TestMethod]
public void TestDecreaseTutorArea()
{
    HelpWith info = new HelpWith();
    info.Subcategories[0] = 1; <<<<<<<<
}
您可能希望使用
列表
而不是
int[]
,因为列表是一个动态数组,它的大小可以增减(这意味着您不必提供初始大小,因为您需要使用
int[]

[TestMethod]
public void TestDecreaseTutorArea()
{
    HelpWith info = new HelpWith();
    info.Subcategories[0] = 1; <<<<<<<<
}

您可能希望使用
列表
而不是
int[]
,因为列表是一个动态数组,它的大小可以增减(这意味着您不必提供初始大小,因为您需要使用
int[]
).

您需要在构造函数中或在创建对象后初始化数组:

    HelpWith info = new HelpWith();
    info.Subcategories = new int[20];
    info.Subcategories[0] = 1;
    info.UserId = 14;
否则,系统如何知道这些阵列应该有多大


(可选地,考虑使用不同的数据类型,例如,如果不想管理数组的长度,但仍然需要初始化它们)

,您需要初始化数组——在构造函数中或创建对象之后:

    HelpWith info = new HelpWith();
    info.Subcategories = new int[20];
    info.Subcategories[0] = 1;
    info.UserId = 14;
否则,系统如何知道这些阵列应该有多大


(可选地,考虑使用不同的数据类型,例如,如果不想管理数组的长度,但仍然需要初始化它们)

<代码>帮助< /COD>构造函数是什么样的?添加异常处理将有助于您。现在看来对象的构造失败了。我不是用C语言写的,但我想知道你是否得到了;并设置;是两个有效整数。如果没有,那么对象的构造可能会失败。
HelpWith
构造函数是什么样子的?添加异常处理应该会对您有所帮助。现在看来对象的构造失败了。我不是用C语言写的,但我想知道你是否得到了;并设置;是两个有效整数。如果没有,那么对象的构造可能会失败。哦。。。你说得对!隐马尔可夫模型。。这带来了一个问题,我无法事先知道它的大小。。。我已经将Public int[]子类别更改为Public List子类别(据我所知,列表不需要特定的长度),但仍然会出现相同的错误。。。即使我也更改了信息子类别[0]=1;至信息子类别。添加(1)@用户2392980,然后使用
List
而不是ArrayI have,我只是在编写响应时过早地按了enter键:P@user2392980,再次在构造函数中初始化列表,查看更新的答案在重新加载页面后,我看到了您的更新答案。现在可以了,谢谢:)哦。。。你说得对!隐马尔可夫模型。。这带来了一个问题,我无法事先知道它的大小。。。我已经将Public int[]子类别更改为Public List子类别(据我所知,列表不需要特定的长度),但仍然会出现相同的错误。。。即使我也更改了信息子类别[0]=1;至信息子类别。添加(1)@用户2392980,然后使用
List
而不是ArrayI have,我只是在编写响应时过早地按了enter键:P@user2392980,再次在构造函数中初始化列表,查看更新的答案在重新加载页面后,我看到了您的更新答案。现在可以了,谢谢:)