在列表中添加列表

时间:2013-05-02 10:48:54

标签: c# .net list exception nullreferenceexception

我有类SellStatement

public class SellStatement
{
    public long billNo
    public DateTime paymentDate;
    public List<string>  ProductName;
    public List<double> quantity;
    public List<double> ratePerQuantity;
}

当我尝试访问函数GetSaleDetails

public Exception GetSaleDetails(List<SellStatement> lss1,string query)
    {
        try
        {
            for (int i = 0; i < lss1.ToArray().Length; i++)
            {
                query = "select * from [product details] where [bill no]=@billno";
                com = new SqlCeCommand(query, con);
                con.Open();
                com.Parameters.AddWithValue("@billno",lss1[i].billNo);
                sdr = com.ExecuteReader();
                while (sdr.Read())
                {
                    lss1[i].ProductName.Add(sdr.GetString(1));//Exception line
                    lss1[i].quantity.Add(sdr.GetDouble(2));
                    lss1[i].ratePerQuantity.Add(sdr.GetDouble(3));       
                }
            }
            con.Close();
            return null;
        }
        catch (Exception e)
        {
            con.Close();
            return e;
        }
    }

空引用异常出现在lss1[i].ProductName.Add(sdr.GetString(1));。我认为错误可能是因为sdr.GetString(1)中的空值,但我检查它有一些价值。我的朋友告诉我你不能改变功能像这样的参数值,所以我尝试将一个列表复制到其他列表中。

 List<SellStatement> lss1 = new List<SellStatement>() ;
            lss1.AddRange(lss);

但它并没有帮助我。添加元素时,我无法弄清楚出了什么问题。

1 个答案:

答案 0 :(得分:4)

如果您在问题中向我们展示了完整的SellStatement课程,那么原因很明确:
您从未初始化ProductNamequantityratePerQuantity。它们是null,这正是异常告诉你的。

要解决此问题,请将您的课程更改为:

public class SellStatement
{
    public long billNo
    public DateTime paymentDate;
    public List<string> ProductName = new List<string>();
    public List<double> quantity = new List<double>();
    public List<double> ratePerQuantity = new List<double>();
}

请注意,这违反了正常的C#设计指南,即您不应该有公共字段。考虑重新设计你的课程:

public class SellStatement
{
    List<string> _productName = new List<string>();
    List<double> _quantity = new List<double>();
    List<double> _ratePerQuantity = new List<double>();

    public long billNo {get; set;}
    public DateTime paymentDate  {get; set;}
    public List<string> ProductName { get { return _productName; } }
    public List<double> quantity { get { return _quantity; } }
    public List<double> ratePerQuantity { get { return _ratePerQuantity; } }
}