2010-06-21 2 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. Проверьте это –

+2

Вы уверены, что Amount_Details не возвращает значение null? – Rup

+1

Если он возвращал значение null, то 'if (d.capacity ...)' должен вызывать исключение – cjk

ответ

1

getData.Amount_Details(id); возвращает null, возможно, потому, что для этого идентификатора нет записей. Вероятно, вы должны изменить поведение Amount_Details(), чтобы вернуть пустой список вместо нуля, если нет записей.

+0

Несомненно, это сработало бы, если бы он назвал емкость нулевой ссылкой на следующей строке, а не на foreach? (согласен с советом, хотя никогда не возвращайте нулевые коллекции!) –

+0

hm, вы правы. Либо это должно произойти в условном или в блоке foreach (потому что либо d, либо temp равны нулю), но и в foreach-decleration? гектометр – Femaref

+0

Есть ли способ, что результат Amount_Details может быть подклассом 'List <>', который переопределил метод GetEnumerator()? Я бы не подумал, что это возможно, но я не могу думать, что еще происходит на линии foreach. – Rup

4

Non-ответ (совет):

Пожалуйста, пожалуйста, х 100000, не правда когда-либо писать код, как:

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

Это совершенно бессмысленно создавать новый список только, чтобы он переписывается в следующем линия.

4

Вы можете использовать null-coalescing operator, чтобы гарантировать, что переменная d никогда не нуль:

List<AmountData> d = getData.Amount_Details(id) ?? new List<AmountData>(); 
Смежные вопросы