2010-06-21 182 views
1

我在C#中有此代码。 它返回“未设置对象实例的对象引用”异常。C#List +未将对象引用设置为对象的实例

代码:

public decimal Calculate(String id) 
    { 
     decimal Total=0; 
     AmountDataDB getData=new AmountDataDB(); 
     List<AmountData> d = new List<AmountData>(); 
     d = getData.Amount_Details(id); 
     if (d.Capacity != 0) 
     { 
      foreach (AmountData temp in d)//NullReference exception occurs here 
      { 
       Total += temp.Amount; 
      } 

     } 
     return Total; 
    } 

这里,AmountDataDB和AmountData两类。 Amount_Details返回一个类型为AmountData的列表。

+1

你AmountData对象可能是NULL。检查它 – 2010-06-21 11:10:13

+2

你是否正面,Amount_Details不返回空? – Rup 2010-06-21 11:10:47

+1

如果它返回null,那么'if(d.capacity ...)'应该抛出异常 – cjk 2010-06-21 11:15:48

回答

1

getData.Amount_Details(id);返回null,可能是因为该特定ID没有记录。如果没有记录,您可能应该更改Amount_Details()的行为以返回空列表而不是null。

+0

当他在下一行的空引用上调用容量时,肯定会崩溃,而不是在foreach上? (同意这个建议,但是永远不会返回null收藏!) – 2010-06-21 11:16:47

+0

嗯,你是对的。要么它必须发生在条件或在foreach块(因为要么d或临时为空),而是在foreach-decleration? HM。 – Femaref 2010-06-21 11:38:20

+0

有没有什么方法可以使Amount_Details的结果成为重写GetEnumerator()方法的'List <>'的子类?我不会认为这是可能的,但我不能认为在每条线上会发生什么。 – Rup 2010-06-21 12:07:19

4

非应答(建议):

请,请X 100000,难道没有写这样的代码:

List<AmountData> d = new List<AmountData>(); 
d = getData.Amount_Details(id); 

这是完全没有意义的创建一个新的名单只有把它在未来覆盖线。

4

您可以使用null-coalescing operator以确保d变量永远不能为null:在您的列表

List<AmountData> d = getData.Amount_Details(id) ?? new List<AmountData>(); 
相关问题