C# &引用;对象引用未设置为对象的实例;尝试将对象添加到类内的列表时出错

C# &引用;对象引用未设置为对象的实例;尝试将对象添加到类内的列表时出错,c#,list,class,object,nullreferenceexception,C#,List,Class,Object,Nullreferenceexception,我定义了一些自定义类,其中包括其他类的列表,如: public class Unit { public string Name { get; set; } public List<Group> Contains { get; set; } } public class Group { public string Name { get; set; } public Type Type { get; set; } public int Numbe

我定义了一些自定义类,其中包括其他类的列表,如:

public class Unit
{
    public string Name { get; set; }
    public List<Group> Contains { get; set; }
}

public class Group
{
    public string Name { get; set; }
    public Type Type { get; set; }
    public int Number { get; set; }
}

public static Type basic_1 = new Type() { Name = "basic_1", Number = 1, Cost = 13 };
Unit unit1 = new Unit() { Name = "Unit 1" };
Group group1 = new Group() { Name = "Group 1", Number = 10, Type = basic_1 };
unit1.Contains.Add(group1);
但是在这里我收到错误(在
Add
方法上)“对象引用未设置为对象的实例”。查看调试器中的局部变量,我可以看到
单元
类型
都已成功创建,
组1
包含它应该包含的所有
类型
值,但
unit1.contains
为空


我做错了什么?仅供参考,我以前从未做过类似的事情,所以我甚至不知道这是否可能,但在这之前它似乎工作得很好。

您的
包含
用户
类中的
列表从未被实例化

您可能希望将
用户
类改为:

public class Unit
{
    public string Name { get; set; }

    List<Group> list = new List<Group>();

    public List<Group> Contains
    {
        get { return list; }
    }
}
公共类单元
{
公共字符串名称{get;set;}
列表=新列表();
公共列表包含
{
获取{返回列表;}
}
}
正如您所看到的那样,
Contains
属性现在只返回一个列表实例,当然可以修改,但永远不会重新生效。很可能,这就是你想要的


虽然这有点超出了您的问题范围,但我建议您将
Contains
属性重命名为
Groups

您的
Contains
列表在
User
类中永远不会被实例化

您可能希望将
用户
类改为:

public class Unit
{
    public string Name { get; set; }

    List<Group> list = new List<Group>();

    public List<Group> Contains
    {
        get { return list; }
    }
}
公共类单元
{
公共字符串名称{get;set;}
列表=新列表();
公共列表包含
{
获取{返回列表;}
}
}
正如您所看到的那样,
Contains
属性现在只返回一个列表实例,当然可以修改,但永远不会重新生效。很可能,这就是你想要的

虽然这有点超出了您的问题范围,但我建议您将
Contains
属性重命名为
Groups

您的
列表Contains
从未初始化过,因此当您尝试访问它时,会出现空引用异常。实际上,所有空引用异常都是相同的,您尝试使用的对象是空的

在本例中,我们只需添加一个默认构造函数来初始化列表

public class Unit
{
    public string Name { get; set; }

    public List<Group> Contains { get; set; }

    public Unit()
    {
        Contains = new List<Group>();
    }
}
您的
列表包含的
永远不会初始化,因此当您尝试访问它时,会出现空引用异常。实际上,所有空引用异常都是相同的,您尝试使用的对象是空的

在本例中,我们只需添加一个默认构造函数来初始化列表

public class Unit
{
    public string Name { get; set; }

    public List<Group> Contains { get; set; }

    public Unit()
    {
        Contains = new List<Group>();
    }
}

您已经初始化了该单元,但单元。包含未初始化。在将对象添加到包含列表之前,必须对其进行初始化

Unit unit1 = new Unit() { Name = "Unit 1" };
Group group1 = new Group() { Name = "Group 1", Number = 10, Type = basic_1 };
unit1.Contains = new List<Group>();
unit1.Contains.Add(group1);
unitunit1=newunit(){Name=“unit1”};
groupgroup1=newgroup(){Name=“group1”,Number=10,Type=basic_1};
unit1.Contains=新列表();
unit1.Contains.Add(组1);

在单元类构造函数中,您可以在此处初始化代码列表

public class Unit
{
public string Name { get; set; }
public List<Group> Contains { get; set; }
public Unit()
{
Contains = new List<Group>();
}
}
公共类单元
{
公共字符串名称{get;set;}
公共列表包含{get;set;}
公共单位()
{
包含=新列表();
}
}

我更喜欢第二种解决方案,因为它将确保无论何时初始化单元,Contains都将自动初始化。

您已初始化单元,但单元。Contains不会初始化。在将对象添加到包含列表之前,必须对其进行初始化

Unit unit1 = new Unit() { Name = "Unit 1" };
Group group1 = new Group() { Name = "Group 1", Number = 10, Type = basic_1 };
unit1.Contains = new List<Group>();
unit1.Contains.Add(group1);
unitunit1=newunit(){Name=“unit1”};
groupgroup1=newgroup(){Name=“group1”,Number=10,Type=basic_1};
unit1.Contains=新列表();
unit1.Contains.Add(组1);

在单元类构造函数中,您可以在此处初始化代码列表

public class Unit
{
public string Name { get; set; }
public List<Group> Contains { get; set; }
public Unit()
{
Contains = new List<Group>();
}
}
公共类单元
{
公共字符串名称{get;set;}
公共列表包含{get;set;}
公共单位()
{
包含=新列表();
}
}

我更喜欢第二种解决方案,因为它将确保无论何时初始化单元,都会自动初始化。几乎所有
NullReferenceException
的情况都是相同的。请参阅“”以获得一些提示。如果不想更改您的类,只需重新设置列表即可。unit1.Contains=新列表();我建议不要创建可写的
Contains
属性。作为只读属性公开的列表仍然可以从类外部修改(例如,可以添加和删除其中的内容),这将防止外部代码将实例设置为null或其他列表。哦,也不要把它命名为
包含
。几乎所有
NullReferenceException
的情况都是一样的。请参阅“”以获得一些提示。如果不想更改您的类,只需重新设置列表即可。unit1.Contains=新列表();我建议不要创建可写的
Contains
属性。作为只读属性公开的列表仍然可以从类外部修改(例如,可以添加和删除其中的内容),这将防止外部代码将实例设置为null或其他列表。哦,也不要将其命名为
Contains
Contains。找不到类型或名称空间名称“var”-请原谅我的n00bishness,但我缺少什么来允许我使用它?它在方法中运行良好,但在类中不起作用。@thanby我编辑了我的答案,看看是否有帮助。通过在属性上使用私有集运算符,您可以在不需要私有字段的情况下完成同样的任务。简化了代码<代码>公共列表包含{get;private set;}
@mason,但是您需要一个构造函数来实例化列表。:)找不到类型或命名空间名称“var”-请原谅我的n00bishness,但我缺少什么来允许我使用它?它在方法中运行良好,但在类中不起作用。@thanby我编辑了我的答案,看看是否有帮助。你也可以完成同样的任务