C#a在对象列表中有一个列表。不允许.add

时间:2014-02-01 21:24:05

标签: c# list nullreferenceexception

我一直收到这个错误。

  

CustomerExcelreader.exe中发生未处理的“System.NullReferenceException”类型异常

其他信息:

  

对象引用未设置为对象的实例。

我不知道为什么,因为我有一个全局对象,并且我知道该对象有效,因为当我使用对象的非列表值时,一切正常。

这是有问题的实际对象。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CustomerExcelreader
{
public class customers
{
    public customers()
    {

    }
    /// <summary>
    /// These work just fine.
    /// </summary>
    public String Guest { get; set; }
    public String Contact { get; set; }
    public String ClubNumber { get; set; }//GuestNumber
    public String CasioNumber { get; set; }

    /// <summary>
    /// Lists of lists
    /// </summary>
    public List<String> Dates { get; set; }
    public List<String> Description { get; set; }
    public List<Double> moneyIN { get; set; }
    public List<Double> moneyOUT { get; set; }
    public List<Double> Balance { get; set; }
    public List<String> Remarks { get; set; }

}
}

这里是它与任何List值混淆的地方,但正常变量很好。

private void addButton_Click(object sender, EventArgs e)
{
    //customers add_customerHistory;
    if (listNames.SelectedIndex >= 0)// && listNames.SelectedIndex <= Pathlist.Capacity)//somehow SelectedIndex could be less then 0 by not picking something.
    {
        //add_customerHistory = CustomerHistoryList[listNames.SelectedIndex];
        textBox1.Text = CustomerHistoryList[listNames.SelectedIndex].ClubNumber;
        CustomerHistoryList[listNames.SelectedIndex].Dates.Add(DateBox.Text);
        CustomerHistoryList[listNames.SelectedIndex].Description.Add(DescriptionBox.Text);
        CustomerHistoryList[listNames.SelectedIndex].moneyIN.Add(Convert.ToDouble(InBox.Text));
        CustomerHistoryList[listNames.SelectedIndex].moneyOUT.Add(Convert.ToDouble(OutBox.Text));
        CustomerHistoryList[listNames.SelectedIndex].Balance.Add(Convert.ToDouble(BalanceBox.Text));
        CustomerHistoryList[listNames.SelectedIndex].Remarks.Add(RemarkBox.Text);
        //CustomerHistoryList[listNames.SelectedIndex].CasioNumber = "Its been changed";
        richTextBox1.Text = CustomerHistoryList[listNames.SelectedIndex].CasioNumber;

    }
    else
    {
        CustomerHistoryList[0].Dates.Add(DateBox.Text);
        CustomerHistoryList[0].Description.Add(DescriptionBox.Text);
        CustomerHistoryList[0].moneyIN.Add(Convert.ToDouble(InBox.Text));
        CustomerHistoryList[0].moneyOUT.Add(Convert.ToDouble(OutBox.Text));
        CustomerHistoryList[0].Balance.Add(Convert.ToDouble(BalanceBox.Text));
        CustomerHistoryList[0].Remarks.Add(RemarkBox.Text);
    }

}

这似乎很奇怪,它在这里不起作用。我想它与对象内的列表有关?我听说那些可以表现得很时髦。

3 个答案:

答案 0 :(得分:3)

您需要在类构造函数中初始化list<String>属性。

public class customers
{
    public customers()
    {
       Dates = new List<String>();
       Description = new List<String>();
       moneyIN  = new List<Double>();
       moneyOUT = new List<Double>();       
       Balance =  new List<Double>();
       Remarks = new List<String>();
    }


    // Other bits (not copied)



}

答案 1 :(得分:1)

在访问其成员(在您的情况下为添加方法)之前,您必须创建一个类的新实例(在您的情况下为 List )。

例如:

CustomerHistoryList[listNames.SelectedIndex].Dates = new List<string>();
CustomerHistoryList[listNames.SelectedIndex].Dates.Add(DateBox.Text);

答案 2 :(得分:0)

正如Chris Hammond指出的那样,仅仅因为你使用属性setter / getter并不意味着它会自动为你创建属性值。只有非可空值类型才会出现这种情况。

将逻辑放在构造函数中或将其更改为私有字段。

public class customers
{
    public customers()
    {
        this.Dates = new List<String>();
        this.Description = new List<String>();
        ...
    }

这使得继承变得棘手,因此您可以使用私有字段

public class customers
{
    private List<String> _dates = new List<String>();
    private List<String> _description = new List<String>();

    public List<String> Dates
    { 
        { return _dates; }
        { _dates = value; }
    }

    public List<String> Description
    { 
        { return _description; }
        { _description = value; }
    }

    ....

请参阅另一篇关于将通用列表公开为属性的文章

Why is it considered bad to expose List<T>?